Introducción:
Combina objetos en estructuras de árbol para representar jerarquías de parte-todo. Permite que los clientes traten de manera uniforme a los objetos individuales y a los compuestos.
Nombre del patrón:
Composite (Compuesto)
Clasificación del patrón:
Estructural
Intención:
Componer objetos en jerarquías parte-todo y permitir a los clientes tratar objetos simples y compuestos de modo uniforme.
Motivación:
Necesitamos representar un conjunto de elementos de una interfaz gráfica de usuario (GUI).
Algunos de estos elementos son simples, mientras que otros están formados por varios elementos más simples. El comportamiento y/o la información que proporciona un elemento complejo está determinada por los elementos que lo componen.
Combina objetos en estructuras de árbol para representar jerarquías de parte-todo. Permite que los clientes traten de manera uniforme a los objetos individuales y a los compuestos.
Nombre del patrón:
Composite (Compuesto)
Clasificación del patrón:
Estructural
Intención:
Componer objetos en jerarquías parte-todo y permitir a los clientes tratar objetos simples y compuestos de modo uniforme.
Motivación:
Necesitamos representar un conjunto de elementos de una interfaz gráfica de usuario (GUI).
Algunos de estos elementos son simples, mientras que otros están formados por varios elementos más simples. El comportamiento y/o la información que proporciona un elemento complejo está determinada por los elementos que lo componen.
Problema
que soluciona
Imaginemos
que necesitamos crear una serie de clases para guardar información acerca de
una serie de figuras que serán círculos, cuadrados y triángulos. Además necesitamos
poder tratar también grupos de imágenes porque nuestro programa permite
seleccionar varias de estas figuras a la vez para moverlas por la pantalla.
En
principio tenemos las clases Círculo, Cuadrado y Triángulo,
que heredarán de una clase padre que podríamos llamar Figura e
implementarán todas la operación pintar(). En cuanto a los grupos de Figuras
podríamos caer en la tentación de crear una clase particular separada de las
anteriores llamada GrupoDeImágenes, también con un método pintar().
Problema.
Esta
idea de separar en clases privadas componentes (figuras) y contenedores
(grupos) tiene el problema de que, para cada uno de los dos atributos, el
método pintar() tendrá una implementación diferente, aumentando la
complejidad del sistema.
Implementación
El
patrón Composite da una solución elegante a este problema, de la que además
resulta en una implementación más sencilla.
A
la clase Figura la llamaríamos Gráfico y de ella extenderían
tanto Círculo, Cuadrado y Triángulo, como GrupoDeImágenes.
Además, ésta última tendría una relación todo-parte de multiplicidad * con Gráfico:
un GrupoDeImágenes contendría varios Gráficos, ya fuesen éstos Cuadrados,
Triángulos, u otras clases GrupoDeImágenes.
Así,
es posible definir a un grupo de imágenes recursivamente. Por ejemplo, un
objeto cuya clase es GrupoDeImágenes podría contener un Cuadrado,
un Triángulo y otro GrupoDeImágenes, este grupo de imágenes
podría contener un Círculo y un Cuadrado. Posteriormente, a este
último grupo se le podría añadir otro GrupoDeImágenes, generando una
estructura de composición recursiva en árbol, por medio de muy poca
codificación y un diagrama sencillo y claro.
Estructura:
Participantes:
Component: Declara la interfaz para los objetos de la composición, es la interfaz de acceso y manipulacion de los componentes hijo e implementa algunos comportamientos por defecto.
Client: Manipula objetos atreves de la interfaz proporcionada por Component.
Composite: Define el comportamiento de los componentes compuestos, almacena a los hijos e implementa las operaciones de manejo de los componentes.
Leaf: Definen comportamientos para objetos primitivos del compuesto.
Component: Declara la interfaz para los objetos de la composición, es la interfaz de acceso y manipulacion de los componentes hijo e implementa algunos comportamientos por defecto.
Client: Manipula objetos atreves de la interfaz proporcionada por Component.
Composite: Define el comportamiento de los componentes compuestos, almacena a los hijos e implementa las operaciones de manejo de los componentes.
Leaf: Definen comportamientos para objetos primitivos del compuesto.
No hay comentarios:
Publicar un comentario