Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INTENCIÓN
Extender la funcionalidad de un objeto en forma dinámica, proporcionando una alternativa
flexible a la creación de subclases.
APLICABILIDAD
Se utiliza este patrón cuando se necesita añadir responsabilidades a objetos individuales
dinámica y transparente, es decir, sin afectar a otros objetos.
Se necesita retirar responsabilidades de algunos objetos.
La extensión por subclases es poco práctica. Por ejemplo, un gran número de
extensiones independientes son posibles y produciría una explosión de subclases por
cada combinación. También cuando la definición de clase puede estar oculta o no
disponible para subclases.
ESTRUCTURA
PARTICIPANTES
Component: define una interfaz para los objetos a extender en forma dinámica.
ConcreteComponent: define un objeto al cual se le puede extender con
responsabilidades adicionales.
Decorator: mantiene una referencia a un objeto componente y define una interfaz que
se ajusta a la interfaz de componente.
ConcreteDecorator: agrega responsabilidades al componente.
COLABORACIONES
ConcreteDecorator-Component: el primero reenvía solicitudes a su objeto Component.
Opcionalmente puede realizar operaciones adicionales antes y después de remitir la solicitud.
IMPLEMENTACIÓN
La interfaz de un objeto decorador debe ajustarse a la interfaz del componente que decora (por
herencia). Omitiendo la clase Decorador abstracta. No hay necesidad de definir una clase
Decorador abstracta cuando sólo tiene que añadir una responsabilidad.
VENTAJAS
Mayor flexibilidad que la herencia estática. Con decoradores, las responsabilidades se
pueden agregar y quitar en tiempo de ejecución con sólo conectar y desconectar ellos.
Por el contrario, la herencia requiere la creación de una nueva clase para cada
responsabilidad adicional.
Evita las clases cargadas de características, ya que permite la adición de
responsabilidades. En lugar de tratar de soportar todas las características previsibles de
una clase compleja y personalizable, se puede definir una clase simple y agregar
funcionalidad incremental con objetos.
Son fáciles de personalizar por aquellos que entienden su estructura.
DESVENTAJAS
Un decorador y su componente no son idénticos. Un decorador actúa como una caja
transparente, pero desde el punto de vista de la identidad del objeto, un componente
decorado no es idéntico a la del propio componente.
Un diseño que utiliza Decorator a menudo resulta en sistemas compuestos por gran
cantidad de pequeños objetos parecidos.
Los objetos sólo se diferencian en la manera en que están interconectados. Esto puede
resultar difícil de aprender y depurar.