Python 弾丸ツアー #DP: ツリー ... step 3: Command::Invoker

OOPデザインパターンリファクタリング

Python.use(better); Python 弾丸ツアー #DP: Tkinter/Python
>>> ツリー(階層構造)
step 3: Command::Invoker
《Python3.1|Jython2.5|IronPython2.6》

《著》小粒ちゃん@湘南組《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/23 ● 第4版♪2010/03/08

step 3: コードの解説

■ Command::Invoker
## ---------------------------------------- Command::Invoker
class Invoker(object): pass

class ButtonInvoker(Invoker, Button):
    def __init__(self, master, image, receiver):
        super().__init__(
            master=master,
            image=image,
            command=PanelCommand(receiver),
            )

 ̄抽象クラス Invoker では、共通するプロトコルを規定します。具象クラス ButtonInvoker では、既存のコンポーネント Button を拡張するとともに、Invoker で規定されたプロトコルを実現します。ButtonInvoker は、Button を介して、いつでも PanelCommand を参照できます。

■ Command::Command
## ---------------------------------------- Command::Command
class Command(object):
    def __init__(self, receiver):
        self.receiver = receiver

    def __call__(self): pass

 ̄抽象クラス Command では、メソッド呼び出しに呼応して、適切な処理を依頼する手段を規定します。

    def __init__(self, receiver):
        self.receiver = receiver

 ̄メソッド __init__ では、イベントに呼応する対象 self.receiver を初期設定します。ここでは、その対象が実行時に確定します。

    def __call__(self): pass

 ̄メソッド __call__ は、演算子 () に呼応して、コンポーネントを操作したときの処理を規定します。

■ Command::ConcreteCommand
## ---------------------------------------- Command::ConcreteCommand
class PanelCommand(Command):
    def __call__(self):
        self.receiver.createPanel()

 ̄具象クラス PanelCommand では、抽象クラス Command で規定したプロトコルを実現します。

    def __call__(self):
        self.receiver.createPanel()

 ̄イベントに呼応する対象 self.receiver に対して、パネルを作成 createPanel するように依頼します。

《TIPS》Tkinterコンポーネント


● Button
 ̄キーワード引数 command= に続いて、呼び出し可能オブジェクトを指定します。このとき、

            command=PanelCommand(receiver),

ボタンをクリックすると、演算子 () に呼応して、特殊メソッド __call__ が呼び出されます。

《Point》ButtonInvoker は、Button の子孫としての特徴を活かして、呼び出し可能オブジェクトの役割を担います。



 ̄ButtonInvoker は、Button を介して、いつでも PanelCommand を参照できます。キーワード引数 command= に指定した、呼び出し可能オブジェクト PanelCommand は、イベントに呼応して起動されます。このとき、クラス呼び出し PanelCommand() の実引数には receiver を指定してあるので、これに実際の処理を依頼します。つまり、アイコンをクリックすると、新たなウィンドウが現れます。□

TOP
》作業中です《