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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值