Se le conoce también como Wrapper (envoltorio).
Intención
Extiende la funcionalidad de un objeto dinámicamente de tal modo que es transparente a sus clientes, utilizando una instancia de una subclase de la clase original que delega las operaciones al objeto original. Provee una alternativa muy flexible para agregar funcionalidad a una clase.
Aplicabilidad
- Hay una necesidad de extender la funcionalidad de una clase, pero no hay razones para extenderlo a través de la herencia.
- Hay la necesidad de extender dinámicamente la funcionalidad de un objeto y quizás quitar la funcionalidad extendida.

Component: Define la interfaz común a todas las clases susceptibles de ser ampliadas con la clase Decorator.
ConcreteComponent: clase cuya funcionalidad se puede extender y en la que se delega en última instancia para realizar las operaciones propias de la clase.
Decorator: Clase abstracta que declara la estructura común a todos los “Decoradores” y declara o implementa, la responsabilidad de mantener una referencia al objeto que se extiende.
ConcreteDecorator: clase concreta que hereda de Decorator e implementa las extensiones de funcionalidad de la clase original ConcreteComponent.
Consecuencias
- El patrón Decorator proporciona mayor flexibilidad que la herencia.
- Utilizando diferentes combinaciones de unos pocos tipos distintos de objetos decorator, podemos crear muchas combinaciones distintas de comportamientos.
- La flexibilidad de los objetos decorator los hace más propenso a errores que la herencia. Por ejemplo, es posible combinar objetos decorator de diferentes formas que no funcionen, o crear referencias circulares entre los objetos decorator.
- Utilizando el patrón Decorator generalmente se tienen menos clases que utilizando la herencia. Teniendo menos clases se simplifica el diseño y la implementación de los programas. Por otro lado, utilizando el patrón Decorator normalmente se tienen más objetos. El gran número de objetos puede realizar el debugging (encontrar y reparar errores de un programa) más complicado.
- Una dificultad asociada al patrón Decorator es que un objeto decorator no es un objeto componente, por lo que se pierde la identidad del objeto. Los objetos componente se esconden detrás de los objetos decorator.
Strategy: El patrón Decorator es útil para organizar las cosas que suceden antes o después de que se llaman a los métodos de otro objeto. Si quieres planificar diferentes cosas que ocurren en medio de las llamadas a un método considera utilizar el patrón Strategy.
Template Method: El patrón Template Method es otra alternativa al patrón Decorator que permite variar el comportamiento en medio de una llamada a un método en lugar de antes o después.
Adapter: Un decorador solo cambia las responsabilidades del objeto, no su interface. El patrón Adapter cambia el interface.
Composite: Este patrón esta relacionado con el patrón Decorator, pero no es lo mismo. No está pensado para la agregación de objetos.
No hay comentarios:
Publicar un comentario