装饰模式--Decorator pattern

定义:动态地给一个对象增加其他职责,就增加对象的功能来说,装饰模式比生成子类实现更为灵活。

UML图如下:



 

Code:
  1. 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象和抽象装饰器。   
  2. 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。   
  3. 抽象装饰(Decorator)角色:持有一个构件(Component)对象的实例,以用来对它进行装饰,并定义一个与抽象构件接口一致的接口。   
  4. 具体装饰(Concrete Decorator)角色:负责给构件对象"加上"附加的功能。  
  5.   
  6. 结构图代码:  
  7.     //抽象构件,定义了具体构件和抽象装饰要实现的方法  
  8.     interface Component  
  9.     {  
  10.         void Operation();  
  11.     }  
  12.     //定义具体构件  
  13.     class ConcreteComponent : Component  
  14.     {  
  15.         public void Operation()  
  16.         {  
  17.             Console.WriteLine("ConcreteComponent Operation");  
  18.         }  
  19.     }  
  20.     //定义抽象装饰者。抽象装饰者也实现了抽象构件的接口  
  21.     abstract class Decorator : Component  
  22.     {  
  23.         //把一个抽象构件作为抽象装饰的成员变量。  
  24.         protected Component comp;  
  25.        //在抽象装饰者的构造函数中为抽象构件初始化。   
  26.         public Decorator(Component c)  
  27.         {  
  28.             this.comp = c;  
  29.         }  
  30.        //还未实现的接口的方法。   
  31.         public abstract void Operation();  
  32.     }  
  33.     //具体装饰者A,继承自抽象装饰。  
  34.     class ConcreteDecoratorA : Decorator  
  35.     {  
  36.         private string addedState; //具体装饰者中新增的成员变量  
  37.         public ConcreteDecoratorA(Component c) : base(c) { }  
  38.         public string AddedState   //具体装饰者中新增的属性  
  39.         {  
  40.             set  
  41.             {  
  42.                 addedState = value;  
  43.             }  
  44.         }  
  45.        //具体装饰者实现了接口中定义的方法   
  46.         public override void Operation()  
  47.         {  
  48.             comp.Operation();    //可以调用原构件对象的Operation方法。  
  49.             Console.WriteLine("ConcreteDecoratorA Operation {0}",addedState);  
  50.         }  
  51.     }  
  52.     //具体装饰者B,继承自抽象装饰。  
  53.     class ConcreteDecoratorB : Decorator  
  54.     {  
  55.         public ConcreteDecoratorB(Component c) : base(c) { }  
  56.         public override void Operation()  
  57.         {  
  58.             comp.Operation(); //可以调用原构件对象的Operation方法。  
  59.             Console.WriteLine("ConcreteDecoratorB Operation ");  
  60.         }  
  61.        // 具体装饰者实现了接口中定义的方法   
  62.         public void AddedBehavior()  
  63.         {  
  64.             Console.WriteLine("This is Added Behavior");  
  65.         }  
  66.     }  
  67.     class Client  
  68.     {  
  69.         public static void Main()  
  70.         {  
  71.             //原生的具体构件   
  72.             ConcreteComponent cc = new ConcreteComponent();  
  73.             cc.Operation();  
  74.             //把原生的具体构件用具体装饰者A进行一次包装  
  75.             ConcreteDecoratorA cda = new ConcreteDecoratorA(cc);  
  76.             cda.AddedState = "Decorator OK ";  
  77.             cda.Operation();  
  78.            //把原生的具体构件用具体装饰者B进行一次包装   
  79.             ConcreteDecoratorB cdb = new ConcreteDecoratorB(cc);  
  80.             cdb.AddedBehavior();  
  81.             cdb.Operation();  
  82.            //把被A包装完的具体构件再用用具体装饰者B进行二次包装   
  83.             ConcreteDecoratorB cdbcda = new ConcreteDecoratorB(cda);  
  84.             cdbcda.Operation();  
  85.         }  
  86.     }  
  87.  Decorator与Component之间既是Is a...的继承关系,又是Has a...的组合关系。使用具体装饰类(ConcreteDecorator)来装饰具体构件对象(ConcreteComponent),装饰完的对象依旧是个Component类型。
        Decorator模式解决的是类的功能的多向扩展,而不是单纯的类的继承。
        Decorator模式提供了比继承更灵活的功能扩展,通过使用不同具体装饰对构件对象的排列组合地包装,能够不同功能的组合。

猜你喜欢

转载自jtlyuan.iteye.com/blog/1262558