例題で学ぶデザインパターン #17:デザインパターン〈GoF〉Visitor, #1

前の記事記事一覧次の記事

例題で学ぶ Jython/Swing デザインパターン《Jython2.5》
デザインパターンGoF〉Visitor

《著》越智ことり+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

■ 概要

例題により、アプリケーションを作成する過程を通して、Jython/Swing によるデザインパターンを習得します。

この課題では、Swing/GUI を使って階層構造を持つ情報を提示します。〈GoF〉Composite/Iterator/Visitor/Command パターンを導入すると、if/for 文によるコードの汚染、配列の境界問題が解消されるので、要求仕様の変更にも柔軟に対処でき、簡潔で見通しの良いコードを記述できるようになります。

《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。

事例:モジュールを起動する

モジュールを起動すると、次のようなウィンドウが現れます。

$ jython2.5b3 -i step15/TreeEx.py


 

ボタン〔Tree〕を押すと、選択したノードを頂点とする部分ツリーが、新たなウィンドウ JTree に表示されます。
ボタン〔Text〕を押すと、選択したノードを頂点とする部分ツリーが、新たなウィンドウ JTextArea に表示されます。

事例:コードの解説

■ モジュール:TreeVisitor.py
from javax.swing.tree import DefaultMutableTreeNode

class Visitor(object):              # Visitor::Visitor
    def visitLeaf(self, node, parent):
        raise NotImplementedError, self.__class__.__name__
    def visitNode(self, node, parent):
        raise NotImplementedError, self.__class__.__name__

class TextVisitor(Visitor):         # Visitor::ConcreteVisitor
    root = None

    def visitLeaf(self, node, parent):
        self.root = "/".join([str(e) for e in list(node.treeNode.path)])

    def visitNode(self, node, parent):
        self.root = "\n".join([
            "%s%s%r (%s)"%(
                "|   "*(level-1),
                "+-- "*(not not level),
                e,
                len(e),
            ) for e, level in zip(node.children(), node.levels())
            ])

class TreeVisitor(Visitor):         # Visitor::ConcreteVisitor
    def __init__(self, node):
        self.root = DefaultMutableTreeNode(node)
        
    def visitLeaf(self, node, parent):
        pass
    
    def visitNode(self, node, parent):
        for e in node:
            child = DefaultMutableTreeNode(e)
            parent.add(child)
            e.accept(self, child)

Tips

》作業中です《

Last updated♪09/06/16