Informática

Patrones de diseño en Java: Patrón Composite

4 octubre, 2013

Siguiendo con los patrones de diseño y su implementación en lenguaje Java, vamos a ver el patrón Composite. Como muchos otros patrones, está presente dentro de la JDK en la estructura de componentes y contenedores de la interfaz gráfica de usuario.

Patrón Composite.

El patrón Composite nos permite construir objetos complejos partiendo de otros más sencillos utilizando una estrategia de composición recursiva. Podemos equiparar este patrón a un panal y sus celdas. Cada objeto simple (celda) puede relacionarse con otros formando una estructura más compleja (panal).

También se puede usar este patrón para tratar a todos los componentes de la estructura en árbol para, mediante una interfaz o superclase, establecer unas reglas de comportamiento que nos permitan tratar a todos los elementos de la misma manera.

Identificaremos los siguientes componentes en la implementación del patrón:

  • Interfaz o superclase de comportamiento: En ella estableceremos las pautas de comportamiento que tanto los componentes como el objeto compuesto deberán cumplir.
  • Hojas: Serán las clases que implementan la interfaz que define el comportamiento, es decir, cada una de las celdas de nuestro panal.
  • Composite: Será la clase que define el objeto compuesto de hojas. En este caso, el panal.
  • Cliente: Será la clase que utilice la implementación de este patrón.

Una vez definidas las partes que intervendrán en este patrón, pasamos al ejemplo práctico.

Ejemplo práctico.

Resumen gráfico de la implementación a través de un diagrama UML:

composite1

Como podemos observar en la implementación se ha diseñado un sistema de clases que representan distintos productos y pedidos y una interfaz IPrecio.

En la interfaz, definimos el comportamiento como se indicaba con anterioridad, estableciendo un método getImporteTotal() que como aparece en la documentación devuelve el precio del elemento/s.

composite2

Cada una de las clases que implementan esta interfaz son hojas del patrón. En este caso hemos distinguido 3 clases:

  • ProductoUnitario: representará productos cuya venta se realiza por unidades indivisibles (e.g.: una botella de vino). Estos productos tendrán una serie de características y una forma específica de calcular el precio (precio unitario por número de unidades).

composite3

composite4

composite5

  • ProductoPeso: representará productos cuya venta depende del peso del mismo (e.g.: un jamón). Como el anterior, tendrá una serie de propiedades y otra manera distinta de calcular el precio (peso del elemento/s por precio por peso).

composite6

composite7

composite8

  • ProductoCompuesto: representará un grupo de productos cuya venta se realiza de forma conjunta (e.g.: una cesta de navidad que contiene varios productos). Esta clase podría desarrollar a la vez los papeles de panal y celda. Contiene una colección de elementos IPrecio que lo conformarán y la implementación del método getImporteTotal() hará llamadas a las implementaciones de cada uno de los elementos de dicha colección.

composite9

composite10

Como último componente de este patrón vemos la clase Pedido, que es una especialización de la clase ProductoCompuesto que añadirá una serie de propiedades (e.g.: nombre del cliente) y unas funcionalidades añadidas.

composite11composite12

Finalmente, crearemos la clase cliente que utilizará esta implementación:

composite13

El código fuente de este ejemplo está disponible para descarga aquí.

 

Puedes compartir este artículo en:
  • Reply
    marcelo
    15 mayo, 2014 at 9:51 pm

    muy buen el ejemplo.
    saludos

Deja un comentario

Información básica acerca de cómo protegemos tus datos conforme al Reglamento General de Protección de Datos (Reglamento UE 2016/679) y en la Ley Orgánica 3/2018, de 5 de diciembre, de Protección de Datos Personales y garantía de los derechos digitales

De conformidad con lo establecido en el Reglamento General de Protección de Datos, te informamos de:

- Quien es el responsable del tratamiento: SEAS, Estudios Superiores Abiertos S.A.U con NIF A-50973098, dirección en C/ Violeta Parra nº 9 – 50015 Zaragoza y teléfono 976.700.660.

- Cuál es el fin del tratamiento: Gestión y control de los comentarios del blog de SEAS. 

- En que basamos la legitimación: En tu consentimiento.

- La comunicación de los datos: No se comunicarán tus datos a terceros.

- Los criterios de conservación de los datos: Se conservarán mientras exista interés mutuo para mantener el fin del tratamiento o por obligación legal. Cuando dejen de ser necesarios, procederemos a su destrucción.

- Los derechos que te asisten: (i) Derecho de acceso, rectificación, portabilidad y supresión de sus datos y a la limitación u oposición al tratamiento, (ii) derecho a retirar el consentimiento en cualquier momento y (iii) derecho a presentar una reclamación ante la autoridad de control (AEPD).

- Los datos de contacto para ejercer tus derechos: SEAS, Estudios Superiores Abiertos S.A.U. C/ Violeta Parra nº 9 –
50015 Zaragoza (España) o través de correo electrónico a lopd@estudiosabiertos.com

- También puedes ponerte en contacto con nuestro Delegado de Protección de Datos en dpd@estudiosabiertos.com

Información adicional: Puedes consultar la información adicional y detallada sobre nuestra política de privacidad