动态代理与装饰器模式的区别

这里,假设大家已经基本了解动态代理与装饰器模式。

我们知道增强一个类的功能而不改变这个类的源码,我们可以有动态代理和装饰器模式这两种办法。(本文讨论的区别只是基于增强类功能的区别)

那么我们该如何选择呢?


这里先说我得出的结论:

装饰器模式可以在不增加新的装饰类的情况下对已有的功能进行组合而得到新的功能,但得修改客户端代码才能使用新的功能。

动态代理则是增加一个新的类来实现功能,哪怕这个功能是对已有功能的组合,但可以不用修改客户端代码。


即区别:1.增不增加新类。2 是否需要更改客户端代码。


开始探究:


先考虑它们的类图,

装饰器:


动态代理:



假设这样一种场景,我们要为类Origin增加A功能,B功能和C功能。


JDK动态代理:需要生成三个Origin的Handler来分别增加A,B,C功能。

这三个代理类分别为OriginHandlerA,OriginHandlerB,OriginHandlerC


装饰器模式:也需要生成三个Origin的装饰器来增加A,B,C的功能。

这三个装饰器分别为OriginDecoratorA,OriginDecoratorB,OriginDecoratorC


现在我们有了新的需求,需要为Origin类增加A,B功能。


动态代理:再生成一个子类来实现AB功能的组合,客户端代码获取对应功能的代理类可以解耦到配置文件中。

这样就可以不用修改客户端代码来实现新的功能了。

装饰器模式:不需要生成新的装饰器类,只需要在客户端代码中组合的OriginDecoratorA和OriginDecoratorB来或者AB功能。


那么问题来了,我们能否把装饰器模式在客户端组合OriginDecoratorA和OriginDecoratorB的代码分离出来,封装到另外一个类中,

再在配置文件中来指定具体的装饰器,这样使得不用改变客户端代码也可以实现AB功能的组合?(这有点像什么了?)





你可能感兴趣的:(设计模式)