动机:对象面临着多方面功能的扩展,使用常规的继承机制使得扩展缺乏灵活性,并且带来子类的膨胀问题。使用此模式动态地给对象增加一些额外的职责


应用:.NET中Stream的实现。

场景:ThinkPad有多个系列,比如T43,T60,除笔记本基本功能,还希望通过添加模块以支持一些扩展功能,如无线、蓝牙、指纹,并且这些扩展功能可以在用户需要的任何时候进行添加。如果把具备一种或多种扩展功能的ThinkPad视为T43和T60的更小型号,会带来型号复杂的问题。如何通过添加扩展模块提供这些扩展功能,而又不会来带型号膨胀问题?

结构

设计模式学习笔记九——Decorator模式


代码

}

设计模式学习笔记九——Decorator模式namespace DesignPattern.Decorator
}

}


要点
1、通过采用组合,而非继承的方法,本模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差”和“子类膨胀”问题。
2、接口一致。装饰对象的接口和被装饰对象的接口一致。Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。可以使用一个或多个Decorator对象来装饰一个Component对象,且装饰后的对象仍然是一个Component对象。
3、保持Component类的简单性。Component类在本模式中充当抽象接口的角色,不应该去实现具体的行为,它应集中于定义接口而不是存储数据。对数据表示的定义应延迟到子类中,否则Component类过于庞大和复杂,因而难以大量使用。而且Decorator类对于Component类应该透明——Component类无需知道Decorator类,Decorator类是从外部来扩展Component类的功能。
4、本模式并非解决“多子类衍生的多继承”问题,应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。

相关文章: