Python 弾丸ツアー #DP: ツリー ... step 4: Composite::Leaf

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

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

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

step 4: コードの解説

■ Composite::Leaf:単体オブジェクト
## ---------------------------------------- Composite::Leaf
class Leaf(Component):

    ## ---------------------------------------- Iterator::ConcreteIterator
    def __iter__(self): return self
    def __repr__(self): return "#%r"%self.item
    def __str__(self): return "%s"%self.item
    def items(self): return [self.item]
    def indents(self, level): return [level]
    def dirs(self): return [False]
    def nodes(self): return [self]

 ̄前 step3 と同じです。

■ Composite::Composite:複合オブジェクト
## ---------------------------------------- Composite::Composite
class Composite(Component):
    def __init__(self, path, item):
        super().__init__(path, item)
        self.children = []

    ## ---------------------------------------- Iterator::ConcreteIterator
    def __iter__(self):
        for e in self.children:
            yield e

    def __repr__(self):
        return "%s(#%s: [%s])"%(
            self.__class__.__name__,
            self.item,
            ",".join([str(e) for e in self]),
            )

    def __str__(self):
        return "\n".join([self.item]+[str(e) for e in self])

    def items(self):
        return reduce(lambda s,e: s+e.items(),
            self, [self.item])

    def indents(self, level=0):
        return reduce(lambda s,e: s+e.indents(level+1),
            self, [level])

    def dirs(self):
        return reduce(lambda s,e: s+e.dirs(),
            self, [True])

    def nodes(self):
        return reduce(lambda s,e: s+e.nodes(),
            self, [self])

    def add_(self, component):
        self.children.append(component)

 ̄前 step3 と同じです。

■ 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),
            )

 ̄前 step3 と同じです。

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

    def __call__(self): pass

 ̄前 step3 と同じです。

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

 ̄前 step3 と同じです。

■ Visitor::Visitor
## ---------------------------------------- Visitor::Visitor
class Visitor(object):
    def visitLeaf_(self, *args): pass
    def visitComposite_(self, *args): pass

 ̄抽象クラス Visitor では、共通するプロトコルを規定します。
・メソッド visitLeaf_ では、末端にあるノード(葉)に対する処理を規定します。
・メソッド visitComposite_ では、中間にあるノード(枝)に対する処理を規定します。

TOP
》作業中です《