Recientemente estoy trabajando en una estructura de árbol, varios nodos, niveles múltiples y aumentables, y un método de impresión(). Al principio, pensé que debería ser un compuesto, i entonces por escrito algún diseño posible y códigos:¿Qué ventaja me traerá el patrón compuesto solo por Array?
$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);
Se ve bien, pienso y comenzar la codificación, el método de impresión() puede seguir iterador patrón más tarde. Pero durante la codificación, ¿me parece demasiado complejo para estos nodos simples? Y tengo que instanciar muchas clases concretas (más de 50 o más, y aumentando). entonces me detuve y pensar de una manera similar sencilla mediante el uso de matriz:
-- 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']);
...
}
Los dos diseños son muy similares, ahora estoy un poco confundido, ¿cuál es el valor del patrón Composite, ¿estoy perdido algo importante de este patrón ?
Mi conclusión: Design Pattern es genial, pero no significa que siempre se prefieran. En este ejemplo, dado que el árbol tiene más de 1000 nodos, un implemento compuesto necesita que el cliente instancia más de 1000 objetos, ¿entonces qué? debe abordar otro patrón Flyweight para mejorar el rendimiento y ahorrar recursos. El programa se vuelve más y más complejo, por fin, un Compuesto + Iterador + Flyweight (+ Vistor a veces) implementan. En un problema simple que puede ser resuelto por una clase con una matriz y un método. Finalmente, en esta pregunta, mi respuesta es: Array implementar derrotas Pattern implementar. – Edward