动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
有时我们希望给某个对象而不是整个类添加一些功能。使用继承机制是添加功能的一种有效途径,从其他类继承过来的可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。
一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。
以下情况使用Decorator模式:
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、处理那些可以撤销的职责。
3、当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类的定义被隐藏,或类定义不能用于生成子类。
Decorator模式的优点和缺点:
1、比静态继承更灵活。与对象的静态继承相比,Decorator模式提供了更加灵活的向对象添加职责的方式。
2、Decorator模式提供了一种“即用即付”的方式来添加职责。它不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用Decorator类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。
装饰对象的接口必须与它所装饰的Component的接口是一致的,因此,所有的ConcreteDecorator类必须有一个公共的父类。保持父类的简单性是很重要的,它应集中于定义接口而不是存储数据。
Decorator模式改变对象外壳。Strategy模式改变对象内核。这是改变对象行为的两种途径。
由于Decorator模式仅从外部改变组件,因此组件无需对它的装饰有任何了解,这些装饰对该组件是透明的。
在Strategy模式中,component组件本身知道可能进行哪些扩充,因此它必须引用并维护相应的策略。基于Strategy的方法可能需要修改component组件以适应新的扩充。一个策略可以有自己特定的接口,而装饰的接口则必须与组件的接口一致。
Adapter模式:Decorator模式不用于Adapter模式,因为装饰仅改变对象的职责而不改变它的接口;而适配器将给对象一个全新的接口。
Composite模式:可以将装饰视为一个退化的、仅有一个组件的组合。然而,装饰仅给对象添加额外的职责,它的目的步子与对象聚集。
Strategy模式:用一个装饰你可以改变对象的外表;而Strategy模式使得你可以改变对象的内核。
本文介绍了Decorator设计模式的概念及其应用场景,探讨了该模式如何以动态、透明的方式给对象添加职责,同时对比了与静态继承、Strategy模式等的区别。
197

被折叠的 条评论
为什么被折叠?



