Patrón estructural Composite(JavaScript) - fapaccha/Dise-o-dirigido-por-el-modelo GitHub Wiki

Composite(JavaScript)

El patrón compuesto permite la creación de objetos con propiedades que son elementos primitivos o una colección de objetos. Cada elemento de la colección puede contener otras colecciones, creando estructuras profundamente anidadas.

Un control de árbol es un ejemplo perfecto de un patrón compuesto. Los nodos del árbol contienen un objeto individual (nodo hoja) o un grupo de objetos (un subárbol de nodos).

Todos los nodos del patrón compuesto comparten un conjunto común de propiedades y métodos que admiten objetos individuales así como colecciones de objetos. Esta interfaz común facilita enormemente el diseño y la construcción de algoritmos recursivos que iteran sobre cada objeto en la colección compuesta.

a

Participantes

Los objetos que participan en este patrón son:

Componente : en código de muestra: nodo declara la interfaz para los objetos en la composición Hoja : en código de muestra: nodo representa objetos de hoja en la composición. Una hoja no tiene hijos Compuesto : en código de muestra: nodo representa ramas (o subárboles) en la composición mantiene una colección de componentes secundarios La función de registro es un ayudante que recopila y muestra los resultados:

var Node = function (name) {
    this.children = [];
    this.name = name;
}
 
Node.prototype = {
    add: function (child) {
        this.children.push(child);
    },
 
    remove: function (child) {
        var length = this.children.length;
        for (var i = 0; i < length; i++) {
            if (this.children[i] === child) {
                this.children.splice(i, 1);
                return;
            }
        }
    },
 
    getChild: function (i) {
        return this.children[i];
    },
 
    hasChildren: function () {
        return this.children.length > 0;
    }
}
 
// recursively traverse a (sub)tree
 
function traverse(indent, node) {
    log.add(Array(indent++).join("--") + node.name);
 
    for (var i = 0, len = node.children.length; i < len; i++) {
        traverse(indent, node.getChild(i));
    }
}
 
// logging helper
 
var log = (function () {
    var log = "";
 
    return {
        add: function (msg) { log += msg + "\n"; },
        show: function () { alert(log); log = ""; }
    }
})();
 
function run() {
    var tree = new Node("root");
    var left = new Node("left")
    var right = new Node("right");
    var leftleft = new Node("leftleft");
    var leftright = new Node("leftright");
    var rightleft = new Node("rightleft");
    var rightright = new Node("rightright");
 
    tree.add(left);
    tree.add(right);
    tree.remove(right);  // note: remove
    tree.add(right);
 
    left.add(leftleft);
    left.add(leftright);
 
    right.add(rightleft);
    right.add(rightright);
 
    traverse(1, tree);
 
    log.show();
}