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();
    }
}