Aunque no es tan interesante como el campo de batalla, un Guerrero Informático debe conocer
sus herramientas de combate y dominarlas para poder aplicarlas en un entorno hostil cuando
la cosa se ponga fea. Una de ellas es el Patrón Ninja Decorator (Decorator Pattern). Vamos
a verlo en más detalle.
Muchas veces os va a tocar añadir funcionalidad al juego que no estaba prevista. Un dia
(o varios) os vendrá el game designer, os llevará a un cuarto frio sin casi iluminación,
os ofrecerá un cafe y os dirá: “Pepito (pon aqui tu nombre), tenemos que hablar. Vamos
a tener que añadir/modificar/eliminar una serie de elementos del juego que no estaban
previstos. Sin embargo, los chicos de márqueting opinan que será muy beneficioso.Como
sabrás, tenemos unos tiempos de entrega muy ajustados por lo que vamos a tener que arrimar
el hombro para que todo salga como estaba previsto.” Esto en términos generales y como
tradución menos diplomática como: “Vas a currar nene!”. Otro escenario posible y menos
dramático será que despertareis en medio de la noche con sudores frios y gritando
“Lo tengo! El personaje tendrá habilidades especiales y cada habilidad tendrá diferentes
grados de efectividad”. Lo apuntareis, seguireis durmiendo y a la mañana siguiente os pondreis
manos a la obra. Empezaries a mirar código y direis ¿donde meto esto sin poner todo el diseño
patas arriba?. Y será entonces cuando os acordeis de este humilde post, “Como se llamaba el rollo
aquel que vi en Starco … Patrón decorador!!”.
Esta es una herramienta que nos servirá para muchas soluciones en las que es necesario dejar abierta
la inclusión de características, elementos, particularidades … etc en alguna de las clases o
entidades de nuestro sistema. En general cuando queremos dar pinceladas sobre alguno de nuestros elementos
será muy útil este patrón. Un ejemplo es el que, en un juego de rol, teniendo nuestro personaje,
queremos añadir una serie de habilidades donde cada habilidad puede tener un diferente grado de efectividad
respecto a personajes con otras habilidades.
> Elementos del patrón Decorator.
Los elementos del patrón decorador son generalmente 3.
–> Componente Concreto. La clase que define nuestra entidad inicial (un personaje, una roca, un enemigo…etc)
–> Componente Decorador. La clase o clases que definen las nuevas pinceladas (comportamientos, detalles, habilidades…etc)
–> Componente Genérico. Esta clase es la que generaliza los componentes y permite al crear una entidad, disponer
tanto de la clase inicial (El componente concreto) como de las clases decoradoras. Una clase intermedia a modo de
aglutinador de Decoraciones es ‘decorator’ que organiza todos las nuevas pinceladas
Como se aprecia en la foto la estructura es muy clara y permite añadir o quitar componentes. ¿QUe diferencia esto de la
jerarquía clásica de clases con mecanismos de herencia? Muy sencillo, que de este modo las decoraciones añadidas son independientes y pueden aplicarse a un objeto concreto. No dependen de una jerarquía sino que pueden aplicarse o no dependiendo de las necesidades del programador y crear nuevos no implica añadir el comportamiento o la ‘decoración’ en todos los nodos o partes de la jerarquía donde deberían figurar. Siempre que puede aplicarse un diseño jerárquico y por herencia es recomendable, pero en la mayoría de los casos pequeños (o grandes) detalles serán más rápidos y sencillos de añadir de esta forma.
Nuestra forma de trabajo será. Necesito un nuevo elemento que complemente a un objeto determinado (pongamos un personaje). Bien, añado una nueva clase de decoración y lo complemento. Si me conviene crear instancias de ese objeto decoradas las crearé y sino seguiré utilizando el objeto con las características iniciales.
> El ejemplo típico. Una ventana de Windows.
Para dejar claros los conceptos de decorador se utiliza generalmente uno de los ejemplos más visuales
y a los que más acostumbrados estamos: las ventanas de windows (léase linux o cualquier otro si procede). Vemos en la
imagen inferior la estructura que tendrá un componente ventana creado de forma que se utilice el patrón decorator.
No vas a necesitar mucho que leer despues de ver esta imagen. Como se puede apreciar. La clase Window es el componente genérico, la clase simpleWindow define lo básico de una ventana y la clase WindowDecorator engloba las diferentes instancia de ventana que podemos encontrar. VerticalScrollBars y HorizontalScrollBarDecorator son pinceladas sobre las diferentes ventanas simples.
> Código de ejemplo para el patrón decorador.
El código asociado seria este:
// the Window interface interface Window { public void draw(); // draws the Window public String getDescription(); // returns a description of the Window } // implementation of a simple Window without any scrollbars class SimpleWindow implements Window { public void draw() { // draw window } public String getDescription() { return "simple window"; } }
Las clases de a continuación contienen los decoradores de todas las clases Window ncluyendo los propios decoradores.
// abstract decorator class - note that it implements Window abstract class WindowDecorator implements Window { protected Window decoratedWindow; // the Window being decorated public WindowDecorator (Window decoratedWindow) { this.decoratedWindow = decoratedWindow; } } // the first concrete decorator which adds vertical scrollbar functionality class VerticalScrollBarDecorator extends WindowDecorator { public VerticalScrollBarDecorator (Window decoratedWindow) { super(decoratedWindow); } public void draw() { drawVerticalScrollBar(); decoratedWindow.draw(); } private void drawVerticalScrollBar() { // draw the vertical scrollbar } public String getDescription() { return decoratedWindow.getDescription() + ", including vertical scrollbars"; } } // the second concrete decorator which adds horizontal scrollbar functionality class HorizontalScrollBarDecorator extends WindowDecorator { public HorizontalScrollBarDecorator (Window decoratedWindow) { super(decoratedWindow); } public void draw() { drawHorizontalScrollBar(); decoratedWindow.draw(); } private void drawHorizontalScrollBar() { // draw the horizontal scrollbar } public String getDescription() { return decoratedWindow.getDescription() + ", including horizontal scrollbars"; } }
Un ejemplo de programa de test quecrea una instancia de decorador completamente decorada con scrolls verticales y horizontales.
public class DecoratedWindowTest { public static void main(String[] args) { // create a decorated Window with horizontal and vertical scrollbars Window decoratedWindow = new HorizontalScrollBarDecorator ( new VerticalScrollBarDecorator(new SimpleWindow())); // print the Window's description System.out.println(decoratedWindow.getDescription()); } }
Muy conciso. Más información en el video de a continuación:
Se ha visto la utilidad del patrón Decorator para el uso en sistemas de entretenimiento. Hemos ganado una nueva herramienta que puede ser útil en cualquier contexto en el que tengamos que ‘decorar’ entidades de nuestro sistema. Este mecanismo permite aprovechar las diferentes pinceladas sobre un mismo objeto de forma que podemos utilizarlas cuando nos sea conveniente sin ceñirnos a una jerarquía concreta o a los mecanismos de herencia tradicionales.
Disfrutadlo.



Si, probablemente lo sea
Buy:Retin-A.Lumigan.Mega Hoodia.Zyban.Petcam (Metacam) Oral Suspension.Prevacid.Valtrex.Nexium.Arimidex.Zovirax.Accutane.100% Pure Okinawan Coral Calcium.Synthroid.Actos.Prednisolone.Human Growth Hormone….
theory http://fbedryr.03GMCPARTS.US/tag/theory+Design+Fundamentals/ : theory…
Fundamentals…