Decorator 装饰者模式

字数 554阅读 105

动机

我们可以通过继承来静态地(在编译期间)扩展对象的功能,不过有时我们也需要在使用对象的时候动态地(在运行时)扩展它 。

我来看一个经典的例子,图形窗口。比如说我们要扩展这个图形窗口的功能,给窗口加上一个框,那么我们得建一个 FramedWindow 类。要新建一个带框窗口,需要创建一个 FramedWindow 的实例。然而,如果如果我们从一个简单的窗口开始,然后在运行时对其进行扩展使之成为一个带框的窗口,这就不可能实现了。

目的

这个模式的目的是动态地给对象附加功能

实现

decorator-uml

装饰者模式中个组件:

  • Component - 可动态添加职责的对象,职责可包括状态也可包括行为
  • ConcreteComponent - 将附加功能扩展的目标对象
  • Decorator - 维护一个 Component 对象的引用,并且定义一个和 Component 接口一致的接口
  • Concret Decorator - 具体装饰者,通过增加状态和行为扩展 Component 对象的功能

描述

装饰者对象适用于需要动态添加或删除一个类的功能的时候;也适用于无法使用子类扩展功能的时候,因为其会导致巨多子类产生。

例子 - 动态扩展图形窗口

decorator - window

相关模式

  • Adapter Pattern - 装饰者模式改变对象的职责,而适配器模式改变的是对象的接口
  • Composite Pattern - 装饰者模式可以看做是只有一个部件的子组合, 不过,装饰者模式还增加了额外的功能。

总结

  • 装饰者模式比用直接用整个类来扩展对象功能来的更方便。装饰者模式也使我们动态的删除已添加的功能成为可能
  • 不过装饰者模式动态地给对象附加功能会加大系统功能测试难度

示例:https://github.com/minorpoet/design-patterns/tree/master/decorator
总目录:http://www.jianshu.com/p/af861220a6cc

推荐阅读更多精彩内容