【起源】
不改变原始类,动态的给某个对象增加一种或多种功能。
比如:公交车有运送功能,想给它添加“无人售票”或“自动报站”功能;不同路线的公交车,添加的功能是这两个功能的排列组合;其实是在原有“运送功能”的基础上,把“额外功能”添加上;
本质:重写对象行为,添加额外功能。
【动机】
动态的给一个对象增加一些额外职责。
【核心】
1.给一个类增加功能,可以通过继承重写该类的方法,在原有方法的基础上,加上新的方法;但是带来一个问题,新加的“额外功能”个数不一定,需要根据排列组合的所有 n 种情况,逐一继承;
2.假设这个类有 m 个子类,每个子类都需要添加额外功能,总共要通过继承新增 m*n 个类;
3.工作量大,效率低,需要改进;
4.从1入手,用“单个额外功能叠加”来代替“枚举额外功能的组合”。通过类继承实现动态添加功能(一个额外功能是一个具体的Decorator);
5.从2入手,把修改“多个子类行为的代码”封装到“一个将子类作为参数的类中”。通过对象组合实现动态选择对象(因为子类的接口都相同);
6.由4和5得出Decorator模式,Decorator类就是同时具有4和5的功能的类
理解:特殊的Adapter类。
特殊体现在两点(1.Adapter的出口与入口一致;2.被适配对象可灵活选择,被父类封装)
因为是Adapter,所以要用对象组合;
因为出口与入口一致,所以直接用继承;
本质:使用了单个对象组合,组合对象的抽象,类继承。
【代码实例】
【模型图】