Está en la página 1de 2

El patrón de decorador se utiliza para ampliar la funcionalidad de un objeto de forma dinámica

sin tener que cambiar la fuente de la clase original o usar la herencia. Esto es
logrado mediante la creación de un contenedor de objetos denominado Decorador alrededor
el objeto real.

El objeto Decorator está diseñado para tener la misma interfaz que el objeto subyacente. Esto
permite que un objeto cliente interactúe con el objeto Decorator exactamente de la misma manera
que lo haría con el objeto real subyacente.
El objeto Decorador contiene una referencia al objeto real.
El objeto Decorador recibe todas las solicitudes (llamadas) de un cliente. A su vez, reenvía estas
llamadas al objeto subyacente.
El objeto Decorator agrega alguna funcionalidad adicional antes o después de reenviar solicitudes al
objeto subyacente. Esto asegura que la funcionalidad adicional se pueda agregar a un objeto dado
externamente en tiempo de ejecución sin modificar su estructura.

Normalmente, en el diseño orientado a objetos, la funcionalidad de una clase determinada se amplía


mediante la herencia. La Tabla 19.1 enumera las diferencias entre el patrón Decorator y la herencia.

Repasemos la utilidad de registro de mensajes que creamos mientras discutíamos el método de


fábrica y los patrones Singleton anteriormente. Nuestro diseño comprendía principalmente una
interfaz Logger y dos de sus implementadores, FileLogger y ConsoleLogger, para registrar mensajes en
un archivo y en la pantalla, respectivamente. Además, teníamos la clase LoggerFactory con un método
de fábrica.

LoggerFactory no se muestra en la Figura 19.1. Esto se debe a que no está directamente relacionado
con la discusión del ejemplo actual.
Supongamos que algunos de los clientes ahora necesitan registrar mensajes de nuevas formas más
allá de lo que ofrece la utilidad de registro de mensajes. Consideremos las siguientes dos pequeñas
características que a los clientes les gustaría tener:

Transforma un mensaje entrante en un documento HTML.


Aplique un cifrado simple por lógica de transposición en un mensaje entrante.

Diferencias entre decorador y herencia

Se utiliza para ampliar la funcionalidad de un objeto en particular.


Se utiliza para ampliar la funcionalidad de una clase de objetos.

No requiere subclases.
Requiere subclasificación.

Dinámica.
Estático.

Asignación de responsabilidades en tiempo de ejecución.


Compilar tiempo de asignación de responsabilidades.

Evita la proliferación de subclases que conducen a una menor complejidad y confusión.


Podría conducir a numerosas subclases, haciendo explotar la jerarquía de clases en ocasiones
específicas.

Mas flexible.
Menos flexible.

Es posible tener diferentes objetos decoradores para un objeto dado simultáneamente. Un cliente
puede elegir qué capacidades desea enviando mensajes a un decorador apropiado.
Tener subclases para todas las combinaciones posibles de capacidades adicionales, que los clientes
esperan de una clase determinada, podría conducir a una proliferación de subclases.

Fácil de agregar cualquier combinación de capacidades. Incluso se puede agregar la misma capacidad
dos veces.
Difícil.

También podría gustarte