Patrón de Diseño: Decorator

ABSTRACT— The Decorator Pattern is used for adding additional functionality to a particular object as opposed to a class of objects. It is easy to add functionality to an entire class of objects by subclassing an object, but it is impossible to extend a single object this way. With the Decorator Pattern, you can add functionality to a single object and leave others like it unmodified.
A Decorator, also known as a Wrapper, is an object that has an interface identical to an object that it contains. Any calls that the decorator gets, it relays to the object that it contains, and adds its own functionality along the way, either before or after the call. This gives you a lot of flexibility, since you can change what the decorator does at runtime, as opposed to having the change be static and determined at compile time by subclassing. Since a Decorator complies with the interface that the object that it contains, the Decorator is indistinguishable from the object that it contains. That is, a Decorator is a concrete instance of the abstract class, and thus is indistinguishable from any other concrete instance, including other decorators. This can be used to great advantage, as you can recursively nest decorators without any other objects being able to tell the difference, allowing a near infinite amount of customization.


INTRODUCCION
Los patrones estructurales están relacionados con cómo las clases y los objetos se combinan para dar lugar a estructuras más complejas. Puede hacerse la distinción de patrones estructurales asociados a clases y asociados a objetos, los primeros utilizarán la herencia, los segundos la composición.
Los patrones estructurales asociados con objetos describen formas de componer los objetos para conseguir nueva funcionalidad. La flexibilidad de la composición de objetos viene de la posibilidad de cambiar la composición en tiempo de ejecución, lo que es imposible con la composición estática de clases. En el presente documento se da a conocer uno de los patrones de diseño asociado a objetos llamado DECORATOR.

I. PATRÓN DE DISEÑO: DECORATOR

A continuación se encuentra la plantilla del patrón objeto de estudio:

1. Nombre del patrón: Decorator.

2. Clasificación del patrón: Estructural.

3. Intención: Permitir añadir responsabilidades a objetos concretos de forma dinámica. Los decoradores ofrecen una alternativa más flexible que la herencia para extender las funcionalidades.

4. También conocido como: Decorador, Wrapper.

5. Motivación:

En ocasiones 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

6. Aplicabilidad:

Este patrón se usa cuando:

Se desee adicionar responsabilidades a objetos individuales dinámicamente sin afectar otros objetos.
Se quieran agregar responsabilidades que puedan ser retiradas
No es práctico adicionar responsabilidades por medio de la herencia
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.

7. Estructura:



8. Participantes:

Componente: Define la interface de los objetos a los que se les pueden adicionar responsabilidades dinámicamente.
ComponenteConcreto: Define el objeto al que se le puede adicionar una responsabilidad.
Decorador: Mantiene una referencia al objeto Componente y define una interface de acuerdo con la interface de Componente.
DecoradorConcreto: Adiciona la responsabilidad al Componente.
9. Colaboraciones:

Decorador redirige sus mensajes sobre un objeto de tipo Componente. Opcionalmente puede invocar métodos adicionales antes y después de la redirección.

10. Consecuencias:

Ventajas

•Es más flexible que la Herencia estática. El patrón Decorator proporciona mayor flexibilidad que la herencia. Esto te permite alterar dinámicamente el comportamiento de los objetos individuales añadiendo y borrando decoradores. La herencia, por otra parte, determina la naturaleza de todas las instancias de una clase estáticamente.
•Permite que la adición de nuevas responsabilidades (nuevas clases de Decoradoras) independiente de las clases los Objetos que ellas extienden.
•Favorece la definición de interfaces y clases bases ligeras. Sólo se “carga” con las funcionalidades que se necesitan, no son necesarias megaclases que sean capaces de hacerlo todo.

Desventajas

•Un Decorador y su Componente no son idénticos. Desde el punto de vista de la identidad de los objetos, un ComponenteDecorator no es idéntico al Componente. Por esto no se puede confiar en la identidad de los objetos cuando se usan Decoradores.
•El patrón Decorador hace que hayan muchos objetos pequeños que son muy parecidos y más difíciles de entender y depurar.
•La flexibilidad de los objetos decorador los hace más propenso a errores que la herencia. Por ejemplo, es posible combinar objetos decorador de diferentes formas que no funcionen, o crear referencias circulares entre los objetos decorador.

11. Implementación:

•Un decorador y su componente deben compartir la misma interfaz.
•El decorador cabeza de jerarquía puede incluir alguna funcionalidad por defecto.
•Los componentes deben ser clases con una interfaz sencilla.
•No es necesario definir la clase abstracta Decorador cuando se trabaja con un solo DecoradorConcreto.
•Mantener ligera AbstractComponent. Facilita la implementación de los decoradores.
•La decoración es recurrente y en general no es conmutativa
•El ConcreteComponentpuede establecerse en el constructor del decorador o posteriormente mediante operaciones Get/SetDecorable

12. Código de ejemplo:

public abstract class Componente {
abstract public void operacion ();
}
public class ComponenteConcreto extends Componente {
public void operacion (){
System.out.println ("ConcreteComponent.Operation ()");
}
}
public abstract class Decorator extends Componente {
protected Componente componente;
public void setComponente (Componente component){
this.componente = component;
}
public void operación (){
if (componente!= null) componente. operación ();
}
}

public class DecoradorConcretoA extends Decorator{
private String estadoAgregado;
public void operacion(){
super.operacion();
estadoAgregado = "Nuevo estado";
System.out.println("DecoradorConcretoA.Operacion()");
}
}
public class DecoradorConcretoB extends Decorator{
public void operacion(){
super.operacion();
agregarComportamiento();
System.out.println ("DecoradorConcretoB.Operacion ()");
}
public void AgregarComportamiento(){
System.out.println ("comportamiento añadido B");
}
}

public class Cliente{
public static void main(String[] args){
ComponenteConcreto c = new ComponenteConcreto();
DecoradorConcretoA d1 = new DecoradorConcretoA();
DecoradorConcretoB d2 = new DecoradorConcretoB();
d1.setComponente(c);
d2.setComponente(d1);
d2.operacion();
}
}
13. Usos Conocidos:
•Es muy utilizado para el embellecimiento de interfaz de usuario (adornar la interfaz).
•Java.util.zip

14. Patrones relacionados:

Este patrón se puede implementar con:

•Adapter: Este patrón cambia las responsabilidades y la interfaces de un objeto.
•Composite: Un DECORATOR se puede mirar como un COMPOSITE de un solo elemento.
•Strategy: Este patrón permite cambiar el contenido de los Objetos par agregar responsabilidades.
•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.

REFERENCIAS
[1] García Pérez Baltasar. Desarrollo rápido de aplicaciones. Version PDF.
[2] Orjuela Luz Marina. Modelos de Programación: Patrones GOF 10. Universidad Distrital Francisco José de Caldas. 2006.
[3] Cuesta Carlos E. Patrones de Diseño. Ingeniería de software I. Universidad Rey Juan Carlos. Versión PDF.
[4] Romero Tapia Esteban. Ayudantía N° 6. Versión PDF.
[5] http://www.lsi.us.es/docencia/get.php?id=668
[6] http://www.info-ab.uclm.es/asignaturas/42579/pdf/04-Capitulo4b.pdf
[7] http://es.wikipedia.org/wiki/Decorator_(patr%C3%B3n_de_dise%C3%B1o)







No hay comentarios:

Publicar un comentario