Decorator 装饰模式——对象结构型模式。
1.动机
在某些情况下我们可能会过度地使用集成来扩展对象的功能,由于集成为类型引入的静态特质,使得这种扩展方式缺乏灵活性,并且随着子类的增多,各种子类的组合会导致更多子类的膨胀。
2.定义
动态地给一个对象添加一些额外的职责。装饰模式相比生成子类更为灵活(消除重复代码,减少子类个数)。
3.用自己的一句话概述
某一个类有多重属性,比如人可以穿夏装可以穿秋装,因此将衣服类抽象出来,夏装和秋装作为衣服的子类。
4.优点
- 采用装饰模式扩展对象的功能比采用继承方式更加灵活。
- 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。
5.缺点
- 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。
6.使用场景
- 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
- 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰模式却很好实现。
- 当对象的功能要求可以动态地添加,也可以再动态地撤销时。
7.总结
- 通过采用组合而非继承的手法,装饰模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了使用继承带来的“灵活性差”和多子类衍生问题。
- 装饰类在接口上表现为is a component的继承关系,即装饰类继承了component类所具有的接口,但在实现上又表现为has a component的组合关系,即装饰类又使用了另一个component类。
- 装饰模式的目的并非解决“多子类衍生的继承”问题。装饰模式应用的要点在于解决主体类在多个方向上的扩展功能——是为装饰的含义。
0 条评论