这里,假设大家已经基本了解动态代理与装饰器模式。
我们知道增强一个类的功能而不改变这个类的源码,我们可以有动态代理和装饰器模式这两种办法。(本文讨论的区别只是基于增强类功能的区别)
那么我们该如何选择呢?
这里先说我得出的结论:
装饰器模式可以在不增加新的装饰类的情况下对已有的功能进行组合而得到新的功能,但得修改客户端代码才能使用新的功能。
动态代理则是增加一个新的类来实现功能,哪怕这个功能是对已有功能的组合,但可以不用修改客户端代码。
即区别:1.增不增加新类。2 是否需要更改客户端代码。
开始探究:
先考虑它们的类图,
装饰器:
动态代理:
假设这样一种场景,我们要为类Origin增加A功能,B功能和C功能。
JDK动态代理:需要生成三个Origin的Handler来分别增加A,B,C功能。
这三个代理类分别为OriginHandlerA,OriginHandlerB,OriginHandlerC
装饰器模式:也需要生成三个Origin的装饰器来增加A,B,C的功能。
这三个装饰器分别为OriginDecoratorA,OriginDecoratorB