装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。
“封装器”是一个能与其他“目标”对象连接的对象。
封装器包含与目标对象相同的一系列方法,它会将所有接收到的请求委派给目标对象。
但是,封装器可以在将请求委派给目标对象后对其进行处理,所以可能会改变最终结果。
封装器与对象实现了相同的接口。
封装器中的引用成员变量可以是遵循相同接口的任意对象。 这使得你可以将一个对象放入多个封装器中, 并在对象中添加所有这些封装器的组合行为。
穿上多件衣服将获得组合性的效果。
使用场景:
- 不需要修改代码并且想要为对象增加新的功能的时候
- 可以将业务逻辑组织为层次结构,可以为各层创造一个装饰,在运行时可以将各种不同逻辑组合成对象。由于对象都遵循通用接口,客户端代码能以相同的方式使用这些对象。
优点
- 不需要创建子类就可以扩展对象行为
- 在运行时添加删除对象的功能
- 可以使用多个封装对象来组合几种行为
- 单一职责原则:可以将实现了许多不同行为的一个大类拆分成多个较小的类。
缺点
- 在封装器栈中删除特定的封装器比较困难
- 实现行为不受中装饰栈顺序的装饰比较困难
- 各层的初始化配置代码看上去可能会很糟糕
与其他设计模式的关系
- 与适配器模式
- 适配器模式可以对已有的对象的接口进行修改
- 装饰模式则能在不改变对象接口的前提下强化对象功能
- 与代理模式
- 适配器提供不同的接口
- 代理模式可以为对象提供相同的接口
- 装饰模式为对象提供加强的接口
- 组合模式
- 组合模式仅对其子节点的结果进行求和
- 装饰为封装对象提供额外的职责