Patrones de diseño de software: Objeto compuesto

El patrón Objeto Compuesto, o Árbol de objetos, es un patrón de diseño estructural que te permite componer objetos en estructuras de árbol y luego trabajar con estas estructuras como si fueran objetos individuales.

¿Qué problema resuelve el patrón objeto compuesto?

Si el modelo central de tu aplicación se puede representar como un árbol, puede ser una buena idea usar el patrón objeto compuesto.

Un ejemplo puede ser una App de logística en la que tienes dos tipos de objetos: Products y Boxes. Una caja puede contener varios productos, así como varias cajas más pequeñas. Estas pequeñas cajas pueden también contener algunos productos, o incluso cajas más pequeñas, y así sucesivamente.

La pregunta sería “cómo determinar el precio total de un pedido con estas características?”.

Podrías intentar un enfoque directo, que es como lo harías en el mundo real, desenvolver todas las cajas, repasar todos los productos y calcular el total, pero en tu programa debes conocer las clases de productos y cajas por las que estás pasando, el nivel de anidamiento de las cajas, etc… El enfoque directo se puede volver una locura rápidamente.

Por eso, el patrón objeto compuesto sugiere que trabajes con Products (Productos) y Boxes (Cajas) a través de una interfaz común que declara un método para calcular el precio total.

¿Cómo funciona?

Si tienes un producto, el método devolvería el precio del producto. Sin embargo, si tuvieras una caja, el método revisaría cada artículo que contiene la caja, preguntaría su precio y luego devolvería un total para esta caja.

Si uno de estos artículos fuera un caja más pequeña, esa caja también empezaría a repasar su contenido y así sucesivamente, hasta que se calcularan los precios de todos los componentes internos.

El patrón compuesto te permite ejecutar un comportamiento recursivamente sobre todos los componentes de un árbol de objetos.

¿Cuál es su mayor beneficio?

El mayor beneficio de este enfoque es que no tienes que preocuparte por las clases concretas de objetos que componen el árbol. O sea, no necesitas saber si un objeto es un producto simple o una caja sofisticada. Puedes tratarlos a todos por igual a través de la interfaz común, y cuando llamas a un método, los propios objetos pasan la solicitud por el árbol.

¿Cuándo usar el patrón Objeto Compuesto (Composite)?

Deberías usar el patrón objeto compuesto cuando tengas que implementar una estructura de objeto similar a un árbol. Este patrón proporciona dos tipos de elementos básicos que comparten una interfaz común: hojas simples y contenedores complejos.

También podrías usar el patrón Composite cuando desees que el código del cliente trate elementos simples y complejos de manera uniforme. Todos los elementos definidos por este patrón comparten una interfaz común.

Pros y contras del patrón objeto compuesto

Los siguientes son algunos de los “pros y cons” de este patrón:

Pros

Contras

  • Puedes trabajar con estructuras de árbol complejas de manera más conveniente (polimorfismo y recursividad)

  • Principio abierto/cerrado. Puedes introducir nuevos tipos de elementos en la aplicación sin romper el código existente

  • Puede ser difícil proporcionar una interfaz común para las clases cuya funcionalidad difiere demasiado. 

“Show me the code”

Si quieres tener una idea de cómo se ve el Patrón Objeto Compuesto puedes ver el ejemplo en PHP de refactoring.guru.

En el ejemplo del “Mundo Real” verás que el patrón Objeto Compuesto puede agilizar el trabajo con cualquier estructura recursiva similar a un árbol, como el árbol HTML DOM. Mientras que los diversos elementos de entrada pueden actuar como hojas, los elementos complejos como formularios y conjuntos de campos (fieldsets) desempeñan el papel de compuestos.

¿Utilizas el patrón Composite en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!

Fuente: