# Propósito
El patrón Composite es un patrón de diseño estructural que permite componer objetos en estructuras de árbol para representar jerarquías de parte-todo.
El objetivo es permitir que los clientes traten de manera uniforme a los objetos individuales y a los complejos. Es especialmente útil para modelar y trabajar con estructuras complejas.
# Problema
Construir objetos complejos compuestos de partes más simples, y cómo tratar de manera uniforme tanto a las partes individuales como al conjunto.
# Solución
La solución que propone el Composite es:
-
Divide los objetos en dos categorías: hojas (objetos individuales) y compuestos (objetos con sub-objetos).
-
Interfaz Común: Proporciona una interfaz común para tratar ambos tipos, simplificando el trabajo con estructuras de árbol.
# Estructura
# Participantes
- Component: Interfaz común para objetos individuales y composiciones.
- Leaf (Hoja): Reperesenta objetos individuales sin hijos.
- Composite (Compuesto): Define el comportamiento para componentes con hijos.
- Client: Interactúa con los objetos a través de la interfaz Component.
# Cuándo Usarlo
-
Representar jerarquías de objetos parte-todo.
-
Que los clientes no tengan que diferenciar al objeto individual del compuesto.
# Ventajas
-
verified
Simplicidad: Trata objetos simples y compuestos por igual.
-
verified
Flexibilidad: Permite construir estructuras jerárquicas complejas.
-
verified
Extensibilidad: Fácil agregado de nuevos tipos de componentes.
# Desventajas
-
warning
Restricciones: Dificultad para restringir tipos de componentes.
-
warning
Rendimiento: Problemas con estructuras de árbol muy grandes.
# Ejemplo: Sistema de archivos
Debemos desarrollar un módulo de gestión que debe organizar y manipular gran cantidad de documentos y carpetas.
Problema
Tratar archivos y carpetas de manera uniforme es un desafío por su jerarquía parte-todo.
Solución planteada
Usamos el patrón Composite para tratar archivos (Leaf) y carpetas (Composite) de manera uniforme bajo la interfaz FileSystemComponent.
# Código Java
interface FileSystemComponent {
void printName();
void add(FileSystemComponent component) throws Exception;
}
class File implements FileSystemComponent {
private String name;
public File(String name) { this.name = name; }
public void printName() { System.out.println("Archivo: " + name); }
public void add(FileSystemComponent comp) { throw new UnsupportedOperationException(); }
}
class Directory implements FileSystemComponent {
private List children = new ArrayList<>();
public void add(FileSystemComponent comp) { children.add(comp); }
public void printName() {
for (FileSystemComponent child : children) child.printName();
}
}
# Mapeo Participantes
- FileSystemComponent (Component): Interfaz común.
- File (Leaf): Elemento individual.
- Directory (Composite): Elemento contenedor.
- Client: Interactúa a través de la interfaz común.
# Conclusiones
El sistema se vuelve más sencillo y escalable al permitir agregar nuevas operaciones o tipos de elementos sin alterar la lógica existente.
# Patrones relacionados
Decorator
A menudo se usa con Composite para añadir responsabilidades.
Flyweight
Puede combinarse para compartir componentes.