Decorator Pattern简单随笔

    
         “装饰模式(Decorator)”又名“包装模式(Wrapper)”,通常用来灵活地扩充对象的功能
          我们可以通过类的继承来扩充父类的功能,但这种继承方式缺乏灵活性,并且会导到子类数量的快速膨胀。恰当地使用装饰模式我们会轻松实现在控制子类数量的基础上,灵活地实现对象功能的扩展。装饰模式比类的继承更灵活。
          装饰模式(Decorator)描述:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
使用场景:
1、扩展一个类的功能,或给一个类增加附加功能
2、动态的给对象增加或删除功能
3、动态增加一组基本功能,自由组合重复使用这一组功能
组织结构:
1、抽象构件:抽象接口,作用是规范准备接收附加功能的对象
2、具体构件:准备接收附加功能的对象,继承抽象构件
3、抽象装饰:持有一个具体构件对象的实例,并定义一个与抽象构件一致的接口(也可以继承于抽象构件)
4、具体装饰:实现附加功能的对象,继承抽象装饰
 
类关系图如下所示:
 
 
主要是通过OperaterDecorator这个抽象类 中的对象组合来启动原有的BASE.WORK()方法,其次是执行额外增加的功能。这个对象可以多次被包装,使实现的功能动态的增加(而使用继承的话,子类相应的会大量增加,因此不建议采用继承来解决此类问题);
 
额外增加的功能类代码如下:
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace DecoratorPatternSam
 6 {
 7     public abstract class OperaterDecorator:Operater 
 8     {
 9         //关键点
10 
11         private Operater _operater;
12         public
 OperaterDecorator(Operater operater) 
13 
        { 
14           this._operater=
operater;
15 
        }
16 
      
17         public override void
 Work()
18 
        {
19            // throw new Exception("The method or operation is not implemented.");

20             this._operater.Work();
21 
        }
22     }
23 }
24 
25 using System;
26 using System.Collections.Generic;
27 using System.Text;
28 
29 namespace DecoratorPatternSam
30 {
31     public class OperaterDecoratorA:OperaterDecorator 
32     {
33         public OperaterDecoratorA(Operater _operater) base(_operater)
34         {
35         
36         }
37         public override void Work()
38         {//关键点
39             base.Work();//
40             AddedWorkMethodA();
41         }
42 
43         private void AddedWorkMethodA()
44         {
45             //throw new Exception("The method or operation is not implemented.");
46             Console.WriteLine("execute added work method a");
47         }
48     }
49 }
50 
51 

 

客户端代码通过包装对象实现相应的功能:

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace DecoratorPatternSam
 6 {
 7     class Program
 8     {
 9         static void Main(string[] args)
10         {
11             OperaterA a = new OperaterA();
12             a.Work();
13             Console.WriteLine("---------------------");
14             OperaterDecoratorA decoraterA = new OperaterDecoratorA(a);
15             decoraterA.Work();
16             Console.WriteLine("---------------------");
17             OperaterDecoratorB decoraterB = new OperaterDecoratorB(decoraterA);
18             decoraterB.Work();
19             Console.WriteLine("---------------------");
20             decoraterA = new OperaterDecoratorA(decoraterB);
21             decoraterA.Work();
22             Console.ReadLine();
23         }
24     }
25 }
26 

 

 

显示结果如下,将额外的方法增加了进去:
 
//****************************动态扩充对象的功能
源代码下载地址:/Files/jasenkin/DecoratorPatternSam.rar
posted @ 2010-03-16 17:21  jasen.kin  阅读(244)  评论(0编辑  收藏  举报