Vous êtes sur la page 1sur 7

http://jimenezroda.wordpress.

com/2009/08 /07/decorator-pattern-patron-decorador/ Decorator Pattern (Patrn Decorador)


7 agosto, 2009 in Patterns and Practices | Tags: Decorator Pattern, Ingeniera del Software, Patterns & Practices Continuando con la temtica de patrones de diseo software, hoy me propongo explicar el patrn Decorador. En ocasiones, durante la etapa de creacin del diseo lgico de nuestra aplicacin, podemos encontrarnos que necesitamos poder extender la funcionalidad de una clase en tiempo de ejecucin. Tambien podemos encontrarnos en la tesitura de necesitar que cierta funcionalidad pueda ser asociada a diferentes componentes. Es en estos contextos donde el patrn Decorador puede salvarnos! Un ejemplo muy utilizado para explicar ste patrn es el ejemplo de una Ventana del sistema. Podemos tener ventanas sin borde, con borde, ventanas que proporcionen un icono con ayuda, ventanas que proporcionen un botn para minimizar a la barra de notificaciones, etc.. Bien, uno podra pensar en crear una clase base llamada Ventana con las funcionalidades bsicas de este objeto. Al necesitar una ventana con bordes, podramos pensar en crear una clase llamada VentanaConBorde que herede de la clase Ventana. Hasta aqu perfecto. Ahora necesitamos tambien una ventana que contenga un icono de ayuda. Volveramos a heredar de Ventana para crear la clase VentanaConIcono. Pero claro, yo quiero tener una ventan con borde e icono. Asi pues tambien debo crear otra clase que herede de VentanaConBorde y que tenga el icono. Esta clase se podra llamar VentanaConBordeEIcono. Una vez hecho esto, nos damos cuenta de que tambien podemos crear ventanas con un botn que minimice a la barra de notificaciones, pero claro pueden ser ventanas con o sin borde y con o sin icono de ayuda (con todas sus combinaciones). Nos podemos dar cuenta de que con la herencia de objetos no podremos solucionar (de una forma simple y mantenible) este problema. Aqu es donde el patrn Decorador nos ayudar. Para empezar, ste es el esquema de la solucin que propone este patrn:

Muestra las clases que aplican al patrn Decorador y las relaciones existentes entre ellas Descripcin de los elementos del diagrama: Component: es una clase abstracta que englobar cualquier elemento que puede ser decorado (en el ejemplo anterior, sera una clase AbstractVentana que incluira los mtodos que definien la interfaz para dibujar los elementos). ConcreteComponent: clase que hereda de Component y que define un elemento que puede ser decorado (la clase Component es abstracta, por lo que no puede instanciarse). Es clase implementar las operaciones de la clase Component dando una primera funcionalida base (en el ejemplo anterior, correspondera con la clase Ventana, y el mtodo dibujara una ventana bsica, sin bordes ni nada parecido). Decorator: es la clase base para cualquier decorador que vayamos a utilizar. Se trata de una clase abstracta que ser agregada (las clases que la hereden) a cada componente (en el ejemplo, sera una clase AbstractDecorator que no implementara los mtodos de la base, pero que tendra como atributo el componente al que se est aplicando (a nivel de instancia)). ConcreteDecorator: se trata de una clase que hereda de Decorator y que define una funcionalidad concreta a aadir al componente (en el ejemplo podra ser aadir un borde, un icono o un botn. Cada una de ellas sera una clase que deriva de Decorator y que puede asociarse a cualquier Ventana).

Un ejemplo prctico
Con tal de que el patrn quede claro, voy a mostrar un pequeo ejemplo de cdigo en el que utilizo este patrn. El ejemplo que voy a desarrollar se trata de elaborar iconos a los que se les pueda aadir otros iconos informando de detalles concretos (por ejemplo, en el sistema operativo Windows Vista, cuando una aplicacin requiere de aprobacin del Administrador, su icono

est decorado con otro pequeo icono en forma de escudo en los 4 colores del icono de windows). Viene a ser el mismo ejemplo. Queremos poder decorar ciertos iconos en funcin de las caractersticas que se apliquen a ese icono.

Esta clase se corresponde con la clase Component del diagrama de clases UML para el patrn Decorator. En segundo lugar, pasamos a crear la clase AbstractDecorator que ser la clase base para todos aquellos decoradores que puedan aplicarse a un icono (en realidad no es ms que otro icono que dibujaremos encima del original, en una posicin concreta).

Esta clase se corresponde con la clase Decorator del diagrama de clases UML del patrn Decorator. Ahora que ya hemos definido las clases base, podemos crear las clases que heredarn de estas y que sern las que nos proporcionarn toda la funcionalidad. Emepezaremos definiendo un decorador concreto:

Esta clase se corresponde con la clase ConcreteDecorator del diagrama de clases UML del patrn Decorator. Y ahora una clase que herede de la clase AbstractIcon y que admita decoradores:

Esta clase se corresponde con la clase ConcreteComponent del diagrama de clases UML para el patrn Decorator. Por ltimo os dejo el cdigo de un formulario Winform en el que se hace uso de todas estas clases para dibujar un icono al que, al pulsar un botn del formulario, se le aade un decorador.

Simplemente remarcar que, por el diseo que hemos realizado, un decorador puede contener otros decoradores, lo que nos proporciona un enorme abanico de posibilidades y combinaciones. Y eso es todo sobre este patrn. Como veis, en determinadas situaciones puede resultarnosde mucha utilidad, como todos los patrones de diseo. Como siempre, espero que este artculo os resulte til e interesante!

Vous aimerez peut-être aussi