Patrones de diseño — COMPOSITE en Swift

Matias Gil E
2 min readDec 12, 2022

--

Este patrón de diseño estructural, nos permite componer objectos en una estructura de árbol y trabajar con dichos objetos de manera individual.

El problema que soluciona esta patrón se da cuando la estructura de objectos de un sistema, tiene forma de árbol. ¿Cómo es eso?, miremos un ejemplo:
Supongamos que tenemos un sistema de compras en el cuál hay productos y paquetes, los cuales pueden estar compuestos por más paquetes y productos. Normalmente para cacular el valor total del carrito de compras, necesitaríamos recorrer cada elemento del carrito, si es un producto, tomar su precio y si es un paquete, ir y recorrer los elementos de dicho paquete y hacer el mismo proceso. Ahora, imaginemos el escenario grande, donde haya una larga línea de paquetes adentro de otro y así sucesivamente. Tendríamos una situación compleja para poder calcular el precio total, ya que la verificación de cada elemento potencialmente llega a ser supremamente extensa.

El patron composite nos permite para este sistema, trabajar con los paquetes y productos, usando una interfaz común para ellos la cual declara el método para calcular el precio total del carrito. Son las clases que implementan la interfaz, las encargadas de calcular su propio precio. Así, un producto devuelve su precio y un paquete, pide a sus productos y paquetes sus respectivo precios y devuelve su sumatoria.

Cada item pide la información necesaria a sus ramificaciones y así sucesivamente.

Comparando el sistema planteado con la estrcutura genéricadel patrón, y mirando el UML a continuación, la interfaz sería el componente que las clases implementan. Leaf en nuestro sistema sería un producto y Composite sería un paquete. Ambos implementan la operation() que en nuestro caso sería calcular el precio.

Miremos a continuación la implementación de dicho sistema en lenguaje Swift.

Revisando cada elemento tenemos:

  • ElementoComprable: Es la interfaz que define la operación a realizar, en este casi es calcular precio.
  • Producto: Implementa la interfaz comprable y el método calcular precio. En este caso simplemente devuelve el precio del producto.
  • Paquete: Implementa la interfaz comprable y el método calcular precio. Adicionalamente contiene un arreglo con elementos de tipo ElementoComprable, ya que un paquete puede contener productos o paquetes. Ambos elementos al implementar la interfaz, ya los reconocemos como tipo ElementoComprable. Para calcular el precio total, pide a cada elemento comparable de su arreglo que le de su respectivo precio.
  • Al final, tenemos un carrito de compras, que puede contener tanto productos como paquetes, y gracias al patrón composite es muy fácil pedir a cada elemento su precio, sin necesidad de validar que tipo de objeto es cada ElementoComprable.

--

--

Matias Gil E

Coding iOS. Software developer, Ms Computer and Information Sciences.