代理设计模式:
作用:为目标(原始对象)增加功能(额外功能,拓展功能)
三种经典应用场景:
1:给原始对象增加额外功能(spring添加事务,Mybatis通过代理实现缓存功能等等)
2:远程代理(网络通信,输出传输(RPC,Dubbo))
3:无中生有,看不见类文件,却能进行使用(MyBatis中使用Mapper接口的实现类)
MyBatis使用代理模式实现缓存:MyBatis源码--04:MyBatis缓存实现-CSDN博客
MyBatis使用代理获得Mapper接口实现类:MyBatis源码分析01 ---- 通过代理确定Mapper接口实现类过程-CSDN博客
装饰器设计模式`:
作用:为目标拓展功能(核心功能)
经典应用场景:
MyBatis实现缓存的过程实际上就使用了装饰器设计模式:
MyBatis通过Cache接口实现缓存功能,我们来看看Cache接口的实现类:
实际上上面的实现方式包括俩大类:PerpetualCache为核心实现类,其它类为核心类的装饰器,用来增强核心类PerpetualCache的功能。
使用方法:
这种直接将实现类作为参数的使用方法可以看作是装饰器设计模式的一种标志.并且装饰器可以"套娃使用",如上图,"套娃"为PerpetualCache增加了日志功能和Lru换出策略.
区别总结
本质区别:
装饰器增加核心功能,和被装饰对象做的是同一件事,为同一个目标服务.
代理增加额外功能,和被代理对象做的是不同的事情. 另外注意远程代理和无中生有的使用场景.