代理設計模式:
作用:為目標(原始對象)增加功能(額外功能,拓展功能)
三種經典應用場景:
? ? ? ? 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換出策略.
區別總結
本質區別:
????????裝飾器增加核心功能,和被裝飾對象做的是同一件事,為同一個目標服務.
? ? ? ? 代理增加額外功能,和被代理對象做的是不同的事情. 另外注意遠程代理和無中生有的使用場景.