《软件设计精要与模式》读书笔记(七)-Decorator 模式
Decorator 模式 (结构性模型)
以对客户端透明的方式动态的为对象附加责任。此模式提供了一个比继承更为灵活的替代方案来扩展对象的功能。虽然与适配器一样的被称作包装者(wrapper)但他们本质有区别。适配器要改变所考虑对象接口,而不一定改变对象的性能;装饰者是要保持对象接口,从而增强对象性能。
通过采用组合而非继承的手法, Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
Decorator模式并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。
适用情况:
1.在不影响其他对象的情况下,动态且透明的增加一个责任到一个对象。
2.希望责任和功能可以随时增加或取消。
3.当无法通过类的继承来扩展功能时。(继承过多;类的定义被隐藏;类的定义不便于生成派生类)
结构:
1.抽象部件(CComponent):定义一个对象接口,可以动态的附加责任到其他对象上。
2.具体部件(CConcreteComponent):定义可以被附加责任的对象。
3.装饰者(CDecorator):维护一个到抽象部件对象的引用,并定义与抽象部件接口一致的接口,以便“装饰”抽象部件对象的接口。
4.具体装饰者(CConcreteDecorator):附加责任到抽象部件,完成具体的“装饰”。
1.适用性
在以下情况下应当使用装饰模式:1.需要扩展一个类的功能,或给一个类增加附加责任;2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销;3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
2.实现要点
让装饰角色还继承抽象构件角色也是装饰模式最大的特点,目的就是给抽象构件增加职责,对外表现为装饰后的构件;
让装饰角色拥有构件角色实例的目的就是让构件能被多个装饰对象来装饰;
在具体应用中可以灵活一点,不一定要有抽象构件和装饰角色。但是,装饰对象继承装饰对象并且拥有它实例的两大特点需要体现;
透明装饰一般通过在基类方法前后进行扩充实现,半透明装饰一般通过新的接口实现。
其它浏览
.NET设计模式(10):装饰模式(Decorator Pattern)
.Net中的设计模式——Decorator模式(此书作者的BLOG)
参考文章
作者:心不蒙尘
出处:http://www.cnblogs.com/stan0714/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-心不蒙尘。