代码改变世界

decorator装饰

2007-09-01 22:47  buru  阅读(146)  评论(0)    收藏  举报
当我们想扩展一个类的功能的时候:
用接口;---每增加一个功能就会增加一个子类.导致子类膨胀.
解决方法:

动机 强类型语言下的设计模式.由于继承为类型引入静态特质,使得这种扩展方式缺乏灵活性.如何根据需要动态(在运行时)的实现,同时避免扩展功能增多带来子类膨胀?


意图:动态地灵活地给一个对象增加额外的职责.

怎么做的:
把要扩增功能的类的抽象类作为参数传到新的抽象类中,并作为新类的私有成员(has a).新的抽象类复制原抽象类的方法(即接口继承),并可以增加需要扩展的方法.

(这个模式太强了!可以辗转传递实例参数实现功能重用和多重扩展而不需多重继承):
Class1 A=new Class1();
DecoratorA da=new DacoratorA(A);//添加A功能;
DecoratorB dab=new DacoratorB(da);//再添加B功能;
=====================================================================
要点:
1.采用组合而非继承.
2.Component类在Decorator模式中充当抽象接口的角色.不用该去实现具体的行为.Component类无需知道Decorator类.
3.Decorator在接口上表现为is-a Component的继承关系,但实际上表现为has-a Component的组合关系.所以装饰侯的对象还是一个Component对象.
4..并不是用来解决多继承问题,而是为装饰--主体在多个方向上的扩展功能.
=======================================================
.net中stream类有两个子类是装饰类.BufferedStream and CryPtoStream
是直接实现实体类,而没有Decorator抽象类.但照样有扩展功能.