terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat composite.md
guest@codeandosimple: ~/blog/design-patterns $ cat composite.md

Patrón Composite_

// "Solo existen dos días en el año en que no se puede hacer nada. Uno se llama ayer y otro mañana" - Dalai Lama

# 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 de Ãrbol Composite

# Estructura

Estructura UML Composite

# 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.

Ejemplo Composite Archivos

# 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.