Contenido del curso

Principios SOLID

Patrones de Diseño

Qué es el patrón Decorator

Resumen

El patrón Decorator es un patrón de diseño estructural que te permite añadir responsabilidades a un objeto de forma dinámica y extender su funcionalidad sin tocar su estructura original. Si trabajas con código que necesita crecer sin romperse, este patrón te da una salida limpia y modular.

¿Qué resuelve el patrón Decorator?

Muchas veces necesitas agregar lógica adicional sobre una ya existente sin modificar la original. Aquí entra el Decorator: envuelve el comportamiento base y le suma capas nuevas, sin alterar la clase que ya funciona.

¿Qué es el patrón Decorator? Es un patrón estructural que añade responsabilidades a un objeto en tiempo de ejecución, envolviéndolo con clases que extienden su comportamiento sin modificar su código original.

Entre sus características principales destacan tres ideas:

  • Permite añadir responsabilidades de forma dinámica.
  • Extiende la funcionalidad sin alterar la estructura original del objeto.
  • Habilita una composición flexible de comportamientos adicionales.

Esa última parte es la que lo hace tan útil: si tienes múltiples decoradores, puedes componerlos entre sí para construir una lógica aumentada sobre la original, como capas que se apilan.

¿Cuándo deberías aplicar el patrón Decorator?

No todo problema necesita un Decorator, pero hay escenarios donde encaja perfecto. Piensa en él cuando tu código requiera flexibilidad y modularidad real.

Estos son los dos casos típicos:

  • Cuando necesitas combinar múltiples comportamientos de forma flexible y modular. Si hay un comportamiento principal y alrededor de él requieres otros, el Decorator te deja componerlos sin fricción.
  • Cuando necesitas añadir funcionalidades en tiempo de ejecución. Si una condición del contexto activa una lógica extra, el Decorator te permite agregar esa responsabilidad sin recompilar ni reescribir la clase base.

¿Cuándo usar Decorator en lugar de herencia? Úsalo cuando necesites combinar comportamientos en tiempo de ejecución o evitar una explosión de subclases. La herencia es estática; el Decorator es dinámico y componible.

¿Cómo aplicar el patrón Decorator paso a paso?

La implementación se resume en cinco pasos: dos para la clase base, dos para los decoradores y uno para unirlos. Esta estructura es la que aparece en el diagrama de clase del patrón y la que vas a replicar en código.

Definición de la clase base

Los primeros dos pasos construyen el objeto que vas a decorar más adelante.

  1. Definir una interfaz o clase abstracta que describa el comportamiento del objeto. Es la clase original, la que tiene el comportamiento principal.
  2. Implementar esa interfaz en clases concretas. Primero abstraes el comportamiento hacia una interfaz y luego lo concretas en clases específicas.

Este paso es clave porque la interfaz será el contrato común que tanto el objeto base como los decoradores van a respetar.

Definición de los decoradores

Los pasos tres y cuatro construyen las capas que van a envolver al objeto base.

  1. Crear una clase decoradora abstracta que implemente la misma interfaz del paso uno. Aquí está el truco: el decorador respeta el mismo contrato que la clase base, por eso pueden intercambiarse o componerse.
  2. Implementar decoradores concretos que extiendan la clase decoradora abstracta. Cada decorador concreto suma un comportamiento específico, y puedes tener varios.

Recuerda que puedes usar múltiples decoradores sobre el mismo código y componerlos como capas. Uno agrega logging, otro agrega validación, otro agrega caché, y todos conviven.

Composición final

El quinto paso es donde todo cobra sentido.

  1. Envolver los objetos básicos del paso uno con los decoradores creados en el paso cuatro. Es decir, tomas tu objeto original y lo metes dentro de uno o varios decoradores para obtener el comportamiento aumentado.

Estos cinco pasos suelen ser mucho más claros cuando los ves en código que cuando los lees como teoría, así que el siguiente paso natural es llevarlos a un ejemplo concreto.

¿Has aplicado el patrón Decorator en algún proyecto? Cuéntalo en los comentarios y comparte cómo lo usaste para extender funcionalidad sin tocar la clase original.