概述:
控制對其它對象的訪問。
使用場景:
保護目標對象
增強目標對象
優點:
代理模式能將代理對象與真實被調用的目標對象分離
一定程度上降低了系統的耦合度,擴展性好
保護目標對象 增強目標對象
缺點:
代理模式會造成系統設計中類的數目增加
在客戶端和目標對象增加一個代理對象,會造成請求處理速度變慢
增加系統的複雜度
拓展:
靜態代理:
通過在代碼中顯式定義一個業務實現類的代理,在代理類中對同名方法進行包裝,用戶通過調用代理類包裝過的業務方法來調用目標類的業務方法,同時對目標類的方法進行增強
動態代理:
通過接口中的方法名,在動態生成的代理類中調用業務實現類的同名方法(一定要是接口)
CGLib代理:
是通過繼承來實現的,生成的動態代理類是業務類的子類,通過重寫業務代碼進行代理,由於是使用的繼承來進行代理,如果這個類是final修飾,那麼這個類是無法被繼承的,如果一個類不是final的,而裏面的方法是final的,那麼方法將不能夠被重寫
Spring拓展:
當Bean有實現接口時, Spring就會用DK的動態代理
當Bean沒有實現接口時, Spring使用CGLib
可以強制使用 CGLib(在 spring配置中加入<aop: aspect- autoproxy proxy- target-class="true"/>)
和其他模式的區別:
代理模式和裝飾者模式:目的不同,裝飾者模式是爲對象加上行爲,而代理模式是控制訪問,代理模式更加註重通過設置代理人的方式來增強目標對象(一般是通過增強目標對象的某些行爲)
代理模式和適配器模式:適配器模式主要改變所考慮對象的接口,而代理類是不能夠改變所代理類的接口的
代碼地址:https://github.com/NoSuchClass/design_pattern/tree/master/src/structural/proxy
In JDK
* java.lang.reflect.Proxy
* RMI