Python.use(better, Tkinter=”GoF”) # Visitor #1
‖記事一覧‖ Python.use(better)《Python3.1》
《著》森こねこ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
α版♪1993/11/25 ● β版♪1995/11/22 ● 第1版♪2003/05/23
事例:コードの解説
■ Composite::Component
## ---------------------------------------- Composite::Component
class Component(object):
抽象クラス Component では、共通するプロトコルを規定します。
■ Visitor::Element
## ---------------------------------------- Visitor::Element def accept_(self, visitor, arg=0): eval("visitor.visit%s_(self, arg)"%self.__class__.__name__)
抽象メソッド accept_ は、共通するプロトコルを規定するもので、対象になるメソッド呼び出しが実行時に確定します。
- インスタンスオブジェクトが属するクラスの名前 self.__class__.__name__ が、メソッドの名前の一部に組み込まれます。
■ Visitor::Visitor
## ---------------------------------------- Visitor::Visitor class Visitor(object): def visitLeaf_(self, *args): pass def visitComposite_(self, *args): pass
抽象クラス Visitor では、共通するプロトコルを規定します。
- メソッド visitLeaf_ では、末端に位置するノード(葉)に対する処理を規定します。
- メソッド visitComposite_ では、中間に位置するノード(枝)に対する処理を規定します。
■ Visitor::ConcreteVisitor
## ---------------------------------------- Visitor::ConcreteVisitor
class ConcreteVisitor(Visitor):
具象クラス ConcreteVisitor では、子孫クラスに共通するプロトコルを規定します。
def __init__(self, client): self.client = client
メソッド __init__ では、さまざまなインスタンス属性を初期設定します。
■ TreeVisitor
class TreeVisitor(ConcreteVisitor):
クラス TreeVisitor では、コンポーネントを使ってツリーを構成します。
def visitLeaf_(self, node, indent): tab1 = " " tab2 = " . " self.client.append( master=self.client.widget, tab=tab1*indent+tab2, image=self.client.fileImage, node=node, )
メソッド visitLeaf_ では、末端に位置するノード(葉)に対する処理を規定します。
def visitComposite_(self, node, indent): tab1 = " " tab2 = " - " self.client.append( master=self.client.widget, tab=tab1*indent+tab2, image=self.client.dirImage, node=node, ) for e in node: e.accept_(TreeVisitor(self.client), indent+1)
メソッド visitComposite_ では、中間に位置するノード(枝)に対する処理を規定します。
■ TextVisitor
class TextVisitor(ConcreteVisitor):
クラス TextVisitor では、文字列を使ってツリーを構成します。
def visitLeaf_(self, node, indent):
self.client.append(self._item(indent, ". ", node))
メソッド visitLeaf_ では、中間に位置するノード(枝)に対する処理を規定します。
def visitComposite_(self, node, indent): self.client.append(self._item(indent, "- ", node)) for e in node: e.accept_(TextVisitor(self.client), indent+1)
メソッド visitComposite_ では、中間に位置するノード(枝)に対する処理を規定します。
def _item(self, indent, s, node): return "\n"+"| "*indent + s + node.item
↑TOP
関連記事
- INDEX《Tkinter》
- Python で学ぶ デザインパターンの世界《Tkinter》
- Let’s GoForward - GoF を反面教師に
- C# Design Patterns 31. The Visitor Pattern.
- Python.use(better, Tkinter=”GoF”)
Visitor
Last updated♪2009/11/03