在讲策略模式的时候,文章着重讲了“面向接口编程”,面向接口编程的好处是可以把客户的行为通过接口在外部的封装类中实现,从而提高了程序弹性。
今天说下“装饰者模式”,首先看下官方定义:
动态的将职责附加在对象上,若想扩展功能,装饰者提供了比继承更有弹性的替代方案
装饰者模式非常好的实现了一个设计原则:类应该对扩展开放,对修改关闭。他告诉我们:运行时扩展,远比时期的继承威力大。
下面是装饰者模式的类图
我们看到图里也使用继承,但重点在于装饰者(Decorator)和被装饰者(ConcreteComponent)有相同的超类型,利用继承达到类型匹配,而不是利用继承获得行为。行为来自装饰者和基础组件,或者与其他装饰者之间的组合关系。
继承可以实现复用,如果不通过继承,如何实现复用呢?组合(composition)和委托(delegation)可以在运行时具有继承行为的效果。继承是在编译时静态决定的,而利用组合的做法扩展对象的行为,可以在运行时动态的进行扩展。
利用动态扩展可以把多个新职责加在对象上,而不用修改原来的代码,不修改现有代码,那么引进bug或意外副作用的机会将大幅减少。
大师说:代码应该像晚霞中的莲花一样关闭(免于改变),如同晨曦的莲花一样开放(能够扩展)。感受模式的好处,编写出高质量的代码。