Patrón Composite
El patrón Composite permite tratar de forma uniforme objetos individuales y grupos de objetos a través de una interfaz común. Úsalo cuando tus datos forman un árbol —archivos y carpetas, nodos de UI, jerarquías organizativas— y los clientes no deberían preocuparse por si están hablando con una hoja o con una rama.
Resumen
El patrón Composite modela jerarquías parte-todo dando a hojas y contenedores la misma interfaz. Una carpeta se comporta como un archivo: ambos tienen un size(), ambos pueden renderizarse. La implementación del contenedor simplemente delega en sus hijos y agrega los resultados. Todo el subárbol se vuelve manipulable de forma recursiva sin que el cliente escriba un solo isFolder.
Cuándo usarlo
- Tu dominio es un árbol (DOM, sistema de archivos, estructura de menú, organigrama).
- Los clientes deben poder operar sobre un elemento individual o sobre todo un subárbol del mismo modo.
- Se añaden nuevos tipos de hoja o composite con el tiempo y quieres que encajen sin tocar a los consumidores.
Ejemplo
interface FileSystemNode {
size(): number;
}
class FileNode implements FileSystemNode {
constructor(private readonly bytes: number) {}
size() { return this.bytes; }
}
class FolderNode implements FileSystemNode {
private children: FileSystemNode[] = [];
add(node: FileSystemNode) { this.children.push(node); return this; }
size() { return this.children.reduce((sum, c) => sum + c.size(), 0); }
}
const root = new FolderNode()
.add(new FileNode(120))
.add(
new FolderNode()
.add(new FileNode(50))
.add(new FileNode(30))
);
console.log(root.size()); // 200Ventajas
- Los clientes trabajan contra una sola interfaz, sin ramificación isLeaf.
- Añadir un nuevo tipo de nodo no se propaga por todo el código.
- Las operaciones recursivas (tamaño, render, búsqueda) se expresan de forma trivial.
Desventajas
- La interfaz compartida puede acabar siendo demasiado genérica, con métodos solo de hoja o solo de composite.
- Difícil de restringir la estructura ("una carpeta solo puede contener archivos de tipo X") a nivel de tipos.
- Recursión excesiva sobre árboles muy profundos puede afectar al rendimiento o reventar la pila.