跳到主要内容

装饰器模式

装饰器模式允许你通过将对象放入包含行为的包装对象中来动态更改对象的行为(例如 prehooks 和 posthooks)。

信息

熟悉 Python 的开发者可能会对 装饰器 这个词感到熟悉。装饰器为 Python 开发者提供了一种创建 高阶函数 的方法,使得可以在不更改函数定义的情况下,动态地为函数添加包装。

装饰器模式正是这种思想在类层面的应用。通过将对象放入包含行为的包装对象中,我们可以动态地更改对象的行为,而不需要更改对象本身。

结构

装饰器模式示意图装饰器模式示意图

装饰器模式中,客户端与高层的组件接口交互,而具体的功能组件和装饰器则分别实现了该接口。功能组件为功能提供了实现,而装饰器则通过组合的方式接受功能组件作为成员变量,在实现的方法中调用功能组件的方法,并在其前后添加额外的行为。

如果装饰器接受的组件的类型为抽象的组件接口,那么还能实现嵌套装饰器,从而形成一个装饰器链。

应用场景

  • 当希望在不修改对象本身的情况下,动态地添加功能时

优缺点

优点

  • 可以用多个装饰封装对象来组合几种行为。
  • 开闭原则:无需创建新子类即可扩展对象的行为。
  • 单一职责原则:可以将实现了许多不同行为的一个大类拆分为多个较小的类。

缺点

  • 当组成装饰器链(栈式结构)后,对非栈顶的装饰器的访问可能会变得困难

代码示例

下面的代码示例展示了装饰器模式的实现。Notifier 是一个组件接口,EmailNotifier 是一个具体的功能组件。BaseDecorator 是所有装饰器的基类,它也实现了 Notifier 接口。SMSDecoratorSlackDecorator 是具体的装饰器,它们包装了 Notifier 对象,并在调用其 send 方法的基础上添加了额外的通知功能。

客户端代码可以通过 Notifier 接口与简单组件(EmailNotifier)和装饰后的组件进行交互,而无需关心其具体实现。装饰器可以嵌套使用,从而动态地组合不同的行为。