Я недавно работал над древовидной структурой, несколькими узлами, несколькими и увеличивающимися уровнями и методом print(). Сначала я подумал, что это должно быть Composite, я тогда записал некоторый возможный дизайн и коды:Какая польза от композитного шаблона приведет меня только к массиву?
$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);
Выглядит хорошо, я думаю, и начать кодирование, метод печати() может следовать Итератор образец позже. Но во время кодирования я чувствую, что это слишком сложно для этих простых узлов? И мне приходится создавать множество конкретных классов (более 50+ и увеличиваться). Тогда я остановился и думал простой подобным образом, используя массив:
-- 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 иногда). Об простой проблеме, которая может быть решена одним классом с помощью массива и одного метода. Наконец, по этому вопросу, мой ответ заключается в том, что Array реализует разыгрывание Pattern. – Edward