Está en la página 1de 4

PATRN DECORATOR

Patrones de diseo

Jaime Adolfo Diaz Vargas

Decorator (patrn de diseo)


El patrn Decorator responde a la necesidad de aadir dinmicamente funcionalidad a un Objeto. Esto nos permite no tener que crear sucesivas clases que hereden de la primera incorporando la nueva funcionalidad, sino otras que la implementan y se asocian a la primera.

Motivacin
Un ejemplo para poder ver la aplicabilidad del patrn decorador podra ser el siguiente:

Disponemos de una herramienta para crear interfaces grcas, que permite aadir funcionalidades como bordes o barras de desplazamiento a cualquier componente de la interfaz.

Una posible solucin sera utilizar la herencia para extender las responsabilidades de la clase. Si optamos por esta solucin, estaramos haciendo un diseo inflexible (esttico), ya que el cliente no puede controlar cuando y como decorar el componente con esa propiedad. La solucin est en encapsular dentro de otro objeto, llamado Decorador, las nuevas responsabilidades. El decorador redirige las peticiones al componente y, adems, puede realizar acciones adicionales antes y despus de la redireccin. De este modo, se pueden aadir decoradores con cualidades aadidas recursivamente.

Aplicabilidad

Aadir objetos individuales de forma dinmica y transparente

Responsabilidades de un objeto pueden ser retiradas Cuando la extensin mediante la herencia no es viable Hay una necesidad de extender la funcionalidad de una clase, pero no hay razones para extenderlo a travs de la herencia. Existe la necesidad de extender dinmicamente la funcionalidad de un objeto y quizs quitar la funcionalidad extendida.

Ejemplo C#[editar]
using System; using System.Collections.Generic; using System.Text; namespace Decorator { class Program { static void Main(string[] args) { BotonDeAyudaDecorator ventanaConBotonDeAyuda = new BotonDeAyudaDecorator(new Ventana()); ventanaConBotonDeAyuda.Dibujar(); Console.WriteLine(); BordeDecorator ventanaConBotonDeAyudaYBorde = new BordeDecorator(ventanaConBotonDeAyuda); ventanaConBotonDeAyudaYBorde.Dibujar(); Console.WriteLine(); BordeDecorator ventanaConBorde = new BordeDecorator(new Ventana()); ventanaConBorde.Dibujar(); Console.WriteLine(); BordeDecorator ventanaConDobleBorde = new BordeDecorator(ventanaConBorde); ventanaConDobleBorde.Dibujar(); Console.WriteLine(); Console.Read(); } //[Clase Component] ver diagrama de clases public interface IVentanaAbstracta {

void Dibujar(); } //[Clase ConcreteComponent] ver diagrama de clases, Clase que se desea decorar public class Ventana : IVentanaAbstracta { public void Dibujar() { Console.Write(" Ventana "); } } //[Clase Decorator] ver diagrama de clases public abstract class VentanaDecorator : IVentanaAbstracta { public VentanaDecorator(IVentanaAbstracta ventanaAbstracta) { _VentanaAbstracta = ventanaAbstracta; } protected IVentanaAbstracta _VentanaAbstracta; public abstract void Dibujar(); } //[Clase ConcreteDecorator] ver diagrama de clases public class BordeDecorator : VentanaDecorator { public BordeDecorator(IVentanaAbstracta ventanaAbstracta) : base(ventanaAbstracta) { } public override void Dibujar() { Console.Write("|"); _VentanaAbstracta.Dibujar(); Console.Write("|"); } } //[Clase ConcreteDecorator] ver diagrama de clases public class BotonDeAyudaDecorator : VentanaDecorator { public BotonDeAyudaDecorator(IVentanaAbstracta ventanaAbstracta) : base(ventanaAbstracta) { } public override void Dibujar() { _VentanaAbstracta.Dibujar(); Console.Write("[Boton de Ayuda]"); } } } }