装饰器模式
装饰器模式允许你通过将对象放入包含行为的包装对象中来动态更改对象的行为(例如 prehooks 和 posthooks)。
信息
结构
装饰器模式示意图
装饰器模式中,客户端与高层的组件接口交互,而具体的功能组件和装饰器则分别实现了该接口。功能组件为功能提供了实现,而装饰器则通过组合的方式接受功能组件作为成员变量,在实现的方法中调用功能组件的方法,并在其前后添加额外的行为。
如果装饰器接受的组件的类型为抽象的组件接口,那么还能实现嵌套装饰器,从而形成一个装饰器链。
应用场景
- 当希望在不修改对象本身的情况下,动态地添加功能时
优缺点
优点
- 可以用多个装饰封装对象来组合几种行为。
- 开闭原则:无需创建新子类即可扩展对象的行为。
- 单一职责原则:可以将实现了许多不同行为的一个大类拆分为多个较小的类。
缺点
- 当组成装饰器链(栈式结构)后,对非栈顶的装饰器的访问可能会变得困难
代码示例
下面的代码示例展示了装饰器模式的实现。Notifier
是一个组件接口,EmailNotifier
是一个具体的功能组件。BaseDecorator
是所有装饰器的基类,它也实现了 Notifier
接口。SMSDecorator
和 SlackDecorator
是具体的装饰器,它们包装了 Notifier
对象,并在调用其 send
方法的基础上添加了额外的通知功能。
客户端代码可以通过 Notifier
接口与简单组件(EmailNotifier
)和装饰后的组件进行交互,而无需关心其具体实现。装饰器可以嵌套使用,从而动态地组合不同的行为。