私は最近、ツリー構造、複数のノード、複数のレベルと増加可能なレベル、print()メソッドを扱っています。まず が、私はそれがコンポジットであるべきと思った、私はその後、いくつかの可能な設計とコードを書いた:コンポジットパターンは、ちょうどアレイに私をもたらすのでしょうか?
$struc = new Node(‘name0’, ‘id0’, ‘desc0’);
$node1 = new Node(‘node1’, ‘id1’, ‘desc1’);
$node2 = new Node(‘node2’, ‘id2’, ‘desc2’);
$node3 = new Node(‘node3’, ‘id3’, ‘desc3’);
$leaf1 = new Leaf(‘leaf1’, ‘ld1’, ‘lesc1’);
$leaf2 = new Leaf(‘leaf2’, ‘ld2’, ‘lesc2’);
$leaf3 = new Leaf(‘leaf3’, ‘ld3’, ‘lesc3’);
$leaf4 = new Leaf(‘leaf4’, ‘ld4’, ‘lesc4’);
$struc.add($node1);
$struc.add($node3);
$node1.add($leaf1);
$node1.add($leaf2);
$node1.add($node2);
$node2.add($leaf3);
$node3.add($leaf4);
がよさそうだ、私は考え、コーディング、印刷()メソッドを開始するIteratorに従うことができます後でパターン。 しかし、コーディング中、私はこれらの単純なノードでは複雑すぎると感じていますか?そして、私は具体的なクラスをたくさんインスタンス化しなければなりません(50以上の、そして増加しています)。私はこのパターンの重要な何かを逃しています、Compositeパターンの価値は何だ、今私は少し混乱している、2つのデザインは非常によく似て
-- Structure Class --
//To be more readable and clear, array here could be
//divided to 3 arrays(root/nodes/leafs), then connect
//in a similar way Composite does.
$struc = array('name0', 'id0', 'desc0',
'children'=>array(
array('node1', 'id1', 'desc1',
'children' => array(
array('leaf1', 'ld1', 'lesc1'),
array('leaf2', 'ld2', 'lesc2'),
array('node2', 'id2', 'desc2',
'children'=>array(array('leaf3', 'ld3', 'lesc3'))
)
)
),
array('node3', 'id3', 'desc3',
'children' => array(array('leaf4', 'ld4', 'lesc4'))
)
)
);
function print($node = $this->struct) {
...
if(isset($node['children'])) $this->print($node['children']);
...
}
:私は、配列を使って、簡単な同様の方法を考えて停止し、 ?
私の結論:デザインパターンは素晴らしいですが、常に好むわけではありません。この例では、ツリーに1000以上のノードがあると仮定すると、Compositeの実装ではクライアントが1000以上のオブジェクトをインスタンス化する必要があります。パフォーマンスを向上させ、リソースを節約するために、Flyweightという別のパターンに対処する必要があります。プログラムはますます複雑になり、最後にComposite + Iterator + Flyweight(+ Vistor)が実装されます。配列と1つのメソッドを持つ1つのクラスで解決できる単純な問題について。最後に、この質問では、私の答えは、配列の実装は、パターンの実装を破るです。 – Edward