El patrón Decorador es un patrón de diseño estructural que te permite adjuntar nuevos comportamientos a los objetos colocando estos objetos dentro de objetos envolventes especiales que contienen los comportamientos.

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

Un ejemplo común, de problema, podría ser una aplicación que necesite tu biblioteca de notificaciones. Esta biblioteca permite que otros programas notifiquen a sus usuarios sobre eventos diversos, mediante email, usando una hipotética clase Notifier, sencilla.

Lo que pasa es que hoy, las personas, esperan recibir notificaciones mediante SMS, o incluso por Facebook.

Para hacerlo, podrías extender la clase Notifier, y añadir los métodos de notificación adicionales en nuevas subclases. El cliente sólo tendría que instanciar la clase de notificación deseada y usarla para todas las notificaciones posteriores.

Sin embargo, podrías querer usar varios tipos de notificación a la vez, utilizando todos los canales. Crear subclases especiales que combinan varios métodos de notificación dentro de una clase inflaría enormemente el código, el de la biblioteca, y el del cliente.

Y esto es lo que intenta resolver el patrón decorador, basado en el principio agregación/composición. Con este enfoque, puedes sustituir el objeto “auxiliar” vinculado por otro, cambiando el comportamiento del contenedor en tiempo de ejecución. Un objeto puede usar el comportamiento de varias clases teniendo referencias a múltiples objetos y delegándoles trabajo.

Wrapper o Envoltura (envoltório)

Otro nombre para el patrón decorador es “Envoltura”. Este nombre expresa la idea principal de este patrón: tener un objeto que se puede vincular con algún objeto objetivo.

La envoltura contiene el mismo conjunto de métodos que el objetivo y delega en él todas las solicitudes que recibe. El contenedor puede alterar el resultado.

De esta forma, una envoltura se convierte en un decorador real , ya que el contenedor implementa la misma interfaz que el objeto envuelto. Desde la perspectiva del cliente estos objetos son idénticos.

¿Cuándo usar el patrón Decorador (Decorator)?

Podrías usar el patrón Decorador cuando necesites poder asignar comportamientos adicionales a los objetos en tiempo de ejecución sin romper el código que usa estos objetos.

El patrón decorador te permite estructurar tu lógica de negocio en capas, crear un decorador para cada capa y componer objetos con varias combinaciones de esta lógica en tiempo de ejecución.

También podrías usar este patrón cuando sea un problema, o no sea posible, extender el comportamiento de un objeto usando la herencia.

Pros y contras del patrón decorador

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

Pros

Contras

  • Puedes extender el comportamiento de un objeto sin crear una nueva subclase

  • Puedes agregar o eliminar responsabilidade de un objeto en tiempo de ejecución

  • Puedes combinar varios comportamientos envolviendo un objeto en varios decoradores

  • Principio de responsabilidad única. Puedes dividir un clase monolítica que implementa variantes posibles de comportamiento en varias clases más pequeñas

  • Es difícil eliminar un envoltorio específico de la pila de envoltorios

  • Es difícil implementar un decorador de tal manera que su comportamiento no dependa del orden en la pila de decoradores

  • El código de configuración inicial de las capas puede verse feo

“Show me the code”

Para ver el Decorador en acción, puedes acceder al ejemplo en PHP de refactoring.guru.

De hecho, el decorador es bastante estándar en código PHP. En el ejemplo de la Vida Real podrás ver cómo el patrón Decorador te ayuda a construir reglas de filtrado de texto complejas para limpiar el contenido antes de representarlo en una página web (comentarios, foros, mensajes privados, etc…).

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

Fuente:

Compartir es construir