Decorator

 
 
 
Clasificación Intención Otros nombres Motivación Aplicabilidad Estructura Participantes
Colaboraciones Consecuencias Implementación Código ejemplo Usos  Patrones Relacionados  Autores
 

Clasificación

Patrón de C++
 

Intención

Agregar funcionalidad "de adorno" a un objeto. 
 

Otros nombres

Wrapper

Motivación

A veces se desea adicionar responsabilidades a un objeto pero no a toda la clase. Las responsabilidades se pueden adicionar por medio de los mecanismos de Herencia, pero este mecanismo no es flexible porque la responsabilidad es adicionada estáticamente. La solución flexible es la de rodear el objeto con otro objeto que es el que adiciona la nueva responsabilidad. Este nuevo objeto es el Decorator.
 

Aplicabilidad

El Decorator se debe usar para: 
     
  • Adicionar responsabilidades a objetos individuales dinámicamente sin afectar otros objetos.
  • Para agregar responsabilidades que pueden ser retiradas
  • Cuando no es práctico adicionar responsabilidades por medio de la herencia.
 

Estructura

Participantes

Component 
  • Define la interface de los objetos a los que se les pueden adicionar responsabilidades dinámicamente.
ConcreteComponent 
  • Define el objeto al que se le puede adicionar una responsabilidad.
Decorator 
  • Mantiene una referencia al objeto Component y define una interface de acuerdo con la interface de Component.
ConcreteDecorator 
  • Adiciona la responsabilidad al Component.
 

Colaboraciones

Decorator propaga los mensajes a su objeto Component. Opcionalmente puede realizar operaciones antes y despues de enviar el mensaje.

Consecuencias

Ventajas 
     
  1. Es más flexible que la Herencia estática.
  2. Permite que la adicion de nuevas responsabilidades (nuevas clases de Decorators) independiente de las clases los Objetos que ellas extienden.
Desventajas 
  1. Un Decorator y su Component no son idénticos. Desde el punto de vista de la identidad de los objetos, un DecoratorComponent no es identico al Component. Por esto no se puede confiar en en la identidad de los objetos cuando se usan Decorators
  2. El patrón Decorator hace que hayan muchos objetos pequeños que son muy parecidos.
 

Implementación

  1. Consistencia de la Interface. La interface del Decorator debe ser como la del Component que está decorando.
  2. Clase Abstracta Decorator. No es necesario definir la clase abstracta Decorator cuando se trabaja con una sola ConcreteDecorrator.
  3. Que la clase Component sea "liviana": Para garantizar la interface, los ConcreteComponet y los Decorator deben heredar de una clase base común (Component). Es preferible que esta clase común (Component) sea "liviana" osea que se preocupe más por la interface que por guardar los datos. Si la clase base contiene una grán cantidad de métodos y atributos, cada DecoratorComponent contendría funcionalidades innecesarias haciendolos demasiado "pesados".
  4. Cambiar la piel de un objeto: En el caso del patrón Decorator, este se asimila como un mecanismo para cambiar la piel de objetos y no, como el Patrón Strategy, para cambiar su contenido. esto quiere decir que Decorator cambia los objetos desde afuera y no desde adentro.
 

Código ejemplo

 

Ejemplo que utiliza el Patron Command y el Patron Decorator 

 

Usos conocidos

Es muy utilizado para adicionar opciones de "embellecimiento" en las interfaces al usuario. 

Patrones relacionados

  1. Adapter: Este patrón cambia las responsabilidades y la interfaces de un objeto.
  2. Composite: Un DECORATOR se puede mirar como un COMPOSITE de un solo elemento.
  3. Strategy: Este patrón permite cambiar el contenido de los Objetos par agregar responsabilidades.
 
 

Autores

Walter Garcia, Gustavo Ospina