动机
我们可以通过继承来静态地(在编译期间)扩展对象的功能,不过有时我们也需要在使用对象的时候动态地(在运行时)扩展它 。
我来看一个经典的例子,图形窗口。比如说我们要扩展这个图形窗口的功能,给窗口加上一个框,那么我们得建一个 FramedWindow 类。要新建一个带框窗口,需要创建一个 FramedWindow 的实例。然而,如果如果我们从一个简单的窗口开始,然后在运行时对其进行扩展使之成为一个带框的窗口,这就不可能实现了。
目的
这个模式的目的是动态地给对象附加功能
实现
装饰者模式中个组件:
- Component - 可动态添加职责的对象,职责可包括状态也可包括行为
- ConcreteComponent - 将附加功能扩展的目标对象
- Decorator - 维护一个 Component 对象的引用,并且定义一个和 Component 接口一致的接口
- Concret Decorator - 具体装饰者,通过增加状态和行为扩展 Component 对象的功能
描述
装饰者对象适用于需要动态添加或删除一个类的功能的时候;也适用于无法使用子类扩展功能的时候,因为其会导致巨多子类产生。
例子 - 动态扩展图形窗口
相关模式
- Adapter Pattern - 装饰者模式改变对象的职责,而适配器模式改变的是对象的接口
- Composite Pattern - 装饰者模式可以看做是只有一个部件的子组合, 不过,装饰者模式还增加了额外的功能。
总结
- 装饰者模式比用直接用整个类来扩展对象功能来的更方便。装饰者模式也使我们动态的删除已添加的功能成为可能
- 不过装饰者模式动态地给对象附加功能会加大系统功能测试难度
示例:https://github.com/minorpoet/design-patterns/tree/master/decorator
总目录://www.greatytc.com/p/af861220a6cc