Patrón Decorador
Por: Robin Ochoa Falla
Objetivos
Agregar responsabilidades menores a una clase.
Añadir responsabilidades a un objeto concreto de forma dinámica, cuando sea imposible la extensión de funcionalidad por herencia, por ser ésta imprevisible en tipo y número
Ejemplo Interfaz Gráfica
Un usuario de herramientas gráficas, por ejemplo, debería añadir propiedades como bordes, scroll bar, a cualquier componente de interfaz.
Primera Solución Interfaz Gráfica Herencia Añadir responsabilidades es con herencia,
heredando un borde de otra clase inserta borde a toda subclase instanciada.
Primera Solución Interfaz Gráfica
Problemas Primera solución
1. No es flexible, pues la elección del borde se hace estáticamente, por lo que el cliente no puede controlar como y cuando decorar el componente con un borde.
2. Si se quiere un componente con borde y deslizadores (por ejemplo) requeriría herencia múltiple además de prever todas las combinaciones factibles lo cual traería explosión combinatoria de clases.
Solución Patrón Decorador
Encerrar el componente en otro objeto que añade el borde.
El objeto que encierra es llamado decorador. El decorador conforma la interfaz del
componente, éste decora de manera que su presencia sea transparente a los usuarios de los componentes.
Solución Decorador
Diagrama de Clases Patrón decorador Interfaz Gráfica
Funciona
1. Se hace primero la ventana
2. Se van agregando los decoradores o adornos.
La ventaja más inmediata que nos proporciona este patrón es que permite mezclar cualquier conjunto de decoradores como sea necesario y el cliente lo prefiera.
Diagrama de Clases Patrón Decorador
PARTES
Componente: Define la interfaz para objetos que pueden tener responsabilidades añadidas a ellos dinámicamente.
Componente concreto: Define un objeto al que pueden ser agregadas responsabilidades adicionales.
Decorador: Mantiene una referencia a un objeto componente y define una interfaz que conforma la interfaz del componente.
Decorador Concreto: Añade responsabilidades al componente.
Ejemplo(1) JAVA
El componente gráfico es un modesto editor de texto: JEditorPane panel_text = new JEditorPane();
Es muy sencillo añadir la funcionalidad del scroll sin usar herencia:
JScrollPane scroll_text = new JScrollPane( panel_text );
El último paso es añadir el decorador (y por añadidura el editor) al contenedor raíz del applet: cont_global.add( scroll_text );
En nuestro ejemplo JEditorPane y JScrollPane heredan de JComponent.
Ejemplo (2)
Ejemplo (3)
Ventajas
Amplia la funcionalidad de una interfaz al tiempo que la mantiene igual y se hace dinámicamente.
No altera la funcionalidad existente, solo añade más funciones.
Las responsabilidades se pueden añadir o quitar.
Desventajas
• Provoca la creación de muchos objetos pequeños encadenados lo que puede llegar a complicar la depuración.
La flexibilidad que provee puede dar problemas, pues da la oportunidad para colocarle muchos deslizadores y varios rebordes (por ejemplo), lo que traería como consecuencia que el componente sea poco practico y de baja calidad.
Las responsabilidades pueden ser ejecutadas a tiempo de ejecución.
Puede conducir a la proliferación de clases pequeñas. En algunas ocasiones se puede omitir la clase decorador, en tal
caso el diagrama quedaría de la siguiente manera:
Bibliografía
Patrones Estrategía y Decorador (http://www.ldc.usb.ve/~teruel/ci3711/patron2/index.html)
Gamma Erick, Helm Richard, Johnson Ralph, Vlissides John. Design Patterns Addison-Wesley publishing Company. United States of America. 1995.
- Grand Mark. Patterns in Java Volume 1. Wiley Computer publishing. United States of America. 1998.
Top Related