Decorator(装饰)–对象结构型模式
一、意图
1.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
二、动机
1.在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
2.如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能 扩展变化”所导致的影响将为最低?
三、适用性
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤销的职责。
3.打给你不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
四、结构
五、效果
1.比静态继承更灵活。
2.避免在层次结构高层的类有太多的特征。
3.Decorator与Component不一样。
4.有许多小对象。
六、实现
1.接口的一致性。
2.省略抽象的Decorator类。
3.保持Component类的简单性
4.改变对象外壳(Decorator)与改变对象内核(Strategy)
七、要点总结
1.通过采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
2.Decorator类在接口上表现为is-a Component的继承关系,即 Decorator类继承了Component类所具有的接口。但在实现上又 表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
3.Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。
八、相关模式
Adapter模式:Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不该变它的接口;而适配器将给对象一个全新的接口。
Component模式:可以将装饰视为一个退化的、仅有一个组件的组合。然而,装饰仅给对象添加一些额外的职责——它的目的不在于对象聚集。
Strategy模式:用一个装饰你可以改变对象的外表;而Strategy模式使得不可以改变对象的内核。这是改变对象的两种途径。
九、举例说明
装饰模式功能名字很能解释它的行为,比如给手机贴膜,也可以给手机加个外壳,也可以随时换模,添加和减少功能很方便等等。
本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解