由来
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,不改变接口,但加入责任(不是通过继承,而是通过组合实现)
意图
装饰模式别名包装器(Wrapper),旨在动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比子类更为灵活。
动机
- 希望给某个对象而不是整个类添加一些功能
- 继承机制一种有效途径,但不够灵活
- 较为灵活的方式是将组件嵌入另一个对象中
- 嵌入的对象为装饰, 与所装饰的组件接口一致
适用场合
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
- 处理那些可以撤消的职责
- 当不能采用生成子类的方法进行扩充时。(一种情况是,可能有大量独立扩展,每一种组合将产生大量的子类,子类数目呈爆炸性增长;另一种情况是因为类定义被隐藏,或类定义不能用于生成子类)
结构、角色和协作
Component
对象接口:可以给对象动态地添加职责
ConcreteComponent
具体对象
Decorator
维持一个指向Component对象的指针,并定义一个与Component接口一致的接口
ConcreteDecorator
向组件添加职责
代码示例
abstract class Component
{
public abstract operation();
}
abstract class Decorator : component
{
protected Component componet;
public abstract override operation()
{
…
}
}
class ConcreteComponent : Component
{
public operation()
{
…
};
}
class ConcreteDecorator{
public override operation(){
};
public AddedBehavior(){
};
}
效果
- 比静态继承更灵活
- 避免在层次结构高层的类有太多的特征
提供了一种“即用即付”的方法来添加职责
应用程序不必为不需要的特征付出代价 - Decorator与Component不一样
Decorator是一个透明的包装
使用装饰时不应该依赖对象标识