Imaginemos que tenemos un editor de texto básico y queremos añadirle nuevas funcionalidades, como un scroll o un borde. Una solución podría ser crear subclases para un editor con scroll, sin scroll, con scroll y con borde, etc. Evidentemente esta no es una buena solución, ya que acabamos con una jungla de clases y subclases.
Con este patrón tratamos de evitar este efecto de herencia-jungla, ya que asignamos dinámicamente nuevas responsabilidades a un objeto. Es una alternativa más flexible a crear subclases para extender la funcionalidad de una clase. De esta forma añadimos atributos o comportamiento adicional a un objeto concreto, no a una clase.
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 ); // Asignamos scroll al panel de texto
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 );
El componente no conoce a su decorador (en este caso el scroll). Es el decorador el que referencia a su componente. Esta es la razón de que al añadir (add) al contenedor raíz debamos usar el decorador (scroll) y no el componente (editor).
Componentes y decoradores deben heredar de una clase común. En nuestro ejemplo JEditorPane y JScrollPane heredan de JComponent.
Para ir a un tutorial sobre el patrón Decorador en tecnologías .NET pulse aquí.