martes, 4 de diciembre de 2012

Patrón de diseño Decorator.

Es un patrón estructural que permite añadir funcionalidad a un objeto de forma dinámica, en tiempo de ejecución, algo que no se puede aplicando herencia para extender la funcionalidad.



Nada mejor que un ejemplo para ilustrar la utilidad de este patrón.
Supongamos que un determinado programa tiene distintas salidas (por consola, fichero, impresora,...).
Sin patrones de diseño podríamos resolver el problema aplicando herencia.



Salida impresora = new Impresora();
impresora.imprimir("Hola mundo");

Salida de la ejecución:
Salida por consola:Hola mundo
Salida por fichero:Hola mundo
Salida por impresora:Hola mundo

Sería una solución estática, tendría que cambiar el código (herencia entre clases) si sólo quiero sacar el texto por consola y la impresora , pero no guardarlo en el fichero. Código: SalidaSinDecorador

Mediante el patrón decorador, tendría esta estructura:


De esta forma añado funcionalidad a la consola de forma dinámica.
¿Cómo decoro la consola?

Consola consola = new Consola();
DecoradorFichero df = new DecoradorFichero(console);
DecoradorImpresora di = new DecoradorImpresora(df=
di.imprimir("Hola Mundo");

"Hola Mundo" saldría por consola, fichero e impresora. Código: SalidaDecorada
  • Consola: es el componente concreto al que queremos añadir funcionalidad
  • Salida: interfaz de los objetos.
  • Decorador: mantiene una referencia a un objeto componente y una interfaz (clase abstracta).
  • DecoradorFichero y DecoradorImpresora: añaden funcionalidad al objeto consola, al que referencia.

¿Cuál es la diferencia entre Decorator y Strategy?

En el Strategy el componente (el objeto que recibe la estrategia) cambia, mientras que con el decorador amplia la funcionalidad pero no cambia el objeto.

No hay comentarios:

Publicar un comentario