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

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

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

《著》越智ことり+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第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 step12/TreeEx.py


 
JTree を頂点とするツリー/colors を頂点とする部分ツリー/violet ノード

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

  

逆に、新たなウィンドウ内でノードを選択すると、もとのウィンドウが「連動」して、関連する情報を表示します。

事例:コードの解説

■ モジュール:TreeModel.py
...
from TreeComposite import Leaf

class Model(object):
    def __init__(self, path, **keys):
        if not path.leaf:
            node = Node(path)
        else:
            node = Leaf(path)
        self.root = node
        self.root.treeNode = DefaultMutableTreeNode(node)
        self.createNodes(path, self.root)

    def createNodes(self, path, parent):
        for e in path.children():
            if not e.leaf:
                node = Node(e)
            else:
                node = Leaf(e)
            child = node
            child.treeNode = DefaultMutableTreeNode(node)
            parent.add(child)
            parent.treeNode.add(child.treeNode)
            if not e.leaf:
                self.createNodes(e, child)

このモジュールでは、各ノードがフォルダーかファイルかを判定して、階層構造を構築します。そのため、if..else を「必要悪」として介在させています。しかし、その影響はこのモジュール内に限定されるので、他のモジュールは汚染されません。
また、各ノードのインスタンス属性 .treeNode には、ツリーの各ノード DefaultMutableTreeNode を保持させます。すると、モデル Model とビュー JTree とは、相互参照が可能になります。

Tips

》作業中です《

Last updated♪09/06/15