Composite
Composite
Composite es un patrón de diseño estructural que te permite componer objetos en estructuras de árbol y trabajar con esas estructuras como si fueran objetos individuales.
Utiliza el patrón Composite cuando tengas que implementar una estructura de objetos con forma de árbol.
El patrón Composite te proporciona dos tipos de elementos básicos que comparten una interfaz común: hojas simples y contenedores complejos. Un contenedor puede estar compuesto por hojas y por otros contenedores. Esto te permite construir una estructura de objetos recursivos anidados parecida a un árbol.
Utiliza el patrón cuando quieras que el código cliente trate elementos simples y complejos de la misma forma.
Todos los elementos definidos por el patrón Composite comparten una interfaz común. Utilizando esta interfaz, el cliente no tiene que preocuparse por la clase concreta de los objetos con los que funciona.
public class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("Operación en la hoja " + name);
}
}
public class Composite implements Component {
private List<Component> children = new ArrayList<>();
public void add(Component component) {
children.add(component);
}
public void remove(Component component) {
children.remove(component);
}
@Override
public void operation() {
System.out.println("Operación en el composite");
for (Component component : children) {
component.operation();
}
}
}
public class Main {
public static void main(String[] args) {
// Creamos componentes
Leaf leaf1 = new Leaf("Hoja 1");
Leaf leaf2 = new Leaf("Hoja 2");
Leaf leaf3 = new Leaf("Hoja 3");
// Creamos un composite
Composite composite = new Composite();
composite.add(leaf1);
composite.add(leaf2);
// Podemos agregar un composite dentro de otro composite
Composite composite2 = new Composite();
composite2.add(leaf3);
composite2.add(composite);
// Llamamos a la operación en el composite principal
composite2.operation();
}
}