Composite permite construir objetos complejos componiendo de forma recursiva objetos similares en una estructura de árbol; Permite manipular todos los objetos contenidos en el árbol de forma uniforme, ya que todos ellos poseen una interfaz común definida en la clase raíz.
Características generales de este patrón:
Nombre:
Composite.
Propósito:
Componer objetos en jerarquías todo-parte y permitir a los clientes tratar objetos simples y compuestos de manera uniforme.
Aplicabilidad:
Este patrón se utiliza generalmente cuando:
· Desee representar jerarquías parte-todo de los objetos (Hay un modelo de componentes, con una estructura rama-hoja o parte de todo el contenedor-contenido).
· Desee que los clientes ignoren la diferencia entre composiciones de objetos y cada uno de los objetos. Los clientes traten a todos los objetos de la estructura compuesta de manera uniforme.
· La estructura puede tener cualquier nivel de complejidad, y es dinámica.
Estructura:

Participantes:
· Component: Declara la interfaz para los objetos en la composición, define los métodos disponibles para todas las partes de la estructura de árbol. Component puede ser implementado como clase abstracta cuando es necesario proporcionar los comportamiento a todos los sub-tipos.
· Composite: Está definido por los componentes que contiene, Composite da soporte a un grupo dinámico de componentes por lo que tiene métodos para añadir y eliminar instancias de su colección. Los métodos definidos en Component son implementados para ejecutar el comportamiento específico de este tipo de compuesto y llamar al mismo método en cada uno de sus nodos.
· Leaf: Define el comportamiento de los objetos primitivos en la composición, es la clase que implementa Component y que proporciona una implementación para cada uno de los métodos de Component. La distinción entre una clase Leaf y una clase Composite es que la hoja no contiene referencias a otros componentes. La clase Leaf representa la más baja en los niveles de la estructura de contención.
· Client: Manipula objetos en la composición a través de Component.
Consecuencias:
· Se define una jerarquía de objetos hoja y objetos compuestos que se van componiendo de forma recursiva.
· El cliente se simplifica, ya que trata los objetos hoja y los compuestos de la misma forma.
· La inclusión de nuevas clases hoja o clases compuestas no modifica la estructura anterior ni el código del cliente.
· La desventaja al poder añadir nuevos componentes surge si se desea restringir el tipo de objetos que forman parte de un compuesto creando la necesidad de comprobaciones dinámicas.
Patrones relacionados:
· Decorator.
· Flyweight.
· Iterator.
Etiquetas: Composite, Patrones Estructurales, Structural patterns