设计模式学习笔记十(Decorator装饰者模式)

动机:由于继承为类型引入了静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能增多),各种子类的组合(扩展功能的组合)会导致更多子类膨胀(多继承)。

如何使“对象功能的扩展”能够根据需求来动态地实现?同时避免“扩展功能地增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致影响将为最低。

意图:动态地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。

基本Code

public abstract class Tank

{

     public abstract void Shot();

     public abstract void Run();

}

 

public  abstract  class  Decorator : Tank  //接口继承

{

     private  Tank  tank;               //Has A 对象组合

     public Decorator(Tank  _tank)

     {

         tank=_tank;

     }

     public override void Shot()

     {

         tank.Shot();

     }

     public override void Run()

{

     tank.Run();

}

}

 

public  class  DecoratorA : Decorator

{

     public DecoratorA(Tank  _tank):base(_tank)

     {

     }

     public override void Shot()

     {

         //红外功能扩展

         //do shot

         base.Shot();

     }

     //如果此功能不扩展,则不需要写这个方法

     public override void Run()

    {

         //Do some Extension 功能扩展

         //do Run

         base.Run();

    }

}

public  class  DecoratorB : Decorator

{

     public DecoratorB(Tank  _tank):base(_tank)

     {

     }

     public override void Shot()

     {

         //水陆两西功能扩展

         //do shot

         base.Shot();

     }

}

public  class  DecoratorC: Decorator

{

     public DecoratorC(Tank  _tank):base(_tank)

     {

     }

     public override void Shot()

     {

         //卫星定位功能扩展

         //do shot

         base.Shot();

     }

}

 

public class T75:Tank

{

     public override void Shot(){}

     public override void Run(){}

}

public class T50:Tank

{

     public override void Shot(){}

     public override void Run(){}

}

 

 

 

public class App

{

     public static void Main()

     {

        Tank  t50=new Tank();

 

        //动态地添加功能

         DecoratorA da=new DecoratorA(t50);  //红外功能

         DecoratorB db=new DecoratorB(da);   //红外、两栖功能

         DecoratorB dc=new DecoratorC(db);   //红外、两栖、卫星定位功能       

     }

}

 

结构图如下:

 

Decorator模式要点:

1、  通过采用组合而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。

2、  Component类在Decorator类中充当抽象接口的角色,不应该去实现具体的行为。而且Decorator类对于Component类应该透明――换言之Component类无需知道Decorator类,Decorator类是从外部来扩展Component类的功能。

3、  Decorator类在接口上表现了is-a Component的继承关系,即Decorator类继承了Component类的所有接口,即Decorator类又使用了另外一个Component类。我们可以使用一个或多个Decorator对象来“装饰”一个Component对象,且装饰后的对象仍然是一个Component对象。

4、  Decorator模式并非解决“多子类衍生的多继承问题”Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”――是为装饰的含义。

 

 

.NET Framework中的Decorator应用

 

MemoryStream ms = new MemoryStream(new byte[] { 100, 101, 102, 103 });

BufferedStream buffer = new BufferedStream(ms);

CryptoStream crypto = new CryptoStream(buffer);


 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值