代理模式的英文叫作Proxy或Surrogate,中文均可譯爲」代理「,所謂代理,就是一我的或者一個機構表明另外一我的或者另外一個機構採起行動。在一些狀況下,一個客戶不想或者不可以直接引用一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用
A. 抽象主題角色
聲明瞭真實主題和代理主題的共同接口,這樣一來在任何可使用真實主題的地方均可以是使用代理主題
B. 代理主題(Proxy)角色:
代理主題角色內部含有對真實主題的引用,從而能夠在任什麼時候候操做真實主題對象;代理主題角色提供一個與真實主題角色相同的接口,以即可以在任什麼時候候均可以替代真實主題控制對真實主題的引用,負責在須要的時候建立真實主題對象(和刪除真實主題對象);代理角色一般在將客戶端調用傳遞給真實的主題以前或以後,都要執行某個操做,而不是單純地將調用傳遞給真實主題對象。
C. 真實主題角色
定義了代理角色所表明地真實對象 java
例如: spring
目標類
攔截器
代理類性能
總結:一、由於利用JDKProxy生成的代理類實現了接口,因此目標類中全部的方法在代理類中都有。
二、生成的代理類的全部的方法都攔截了目標類的全部的方法。而攔截器中invoke方法的內容正好就是代理類的各個方法的組成體。
三、利用JDKProxy方式必須有接口的存在。
四、invoke方法中的三個參數能夠訪問目標類的被調用方法的API、被調用方法的參數、被調用方法的返回類型。.net
用JDK動態代理模式重構hibernate
用JDK動態代理模式重構hibernate事務3d
一、 CGlib是一個強大的,高性能,高質量的Code生成類庫。它能夠在運行期擴展Java類與實現Java接口。
二、 用CGlib生成代理類是目標類的子類。
三、 用CGlib生成 代理類不須要接口
四、 用CGLib生成的代理類重寫了父類的各個方法。
五、 攔截器中的intercept方法內容正好就是代理類中的方法體代理
用cglib動態代理模式重構hibernate事務對象
若目標對象實現了若干接口,spring使用JDK的java.lang.reflect.Proxy類代理。
優勢:由於有接口,因此使系統更加鬆耦合
缺點:爲每個目標類建立接口
若目標對象沒有實現任何接口,spring使用CGLIB庫生成目標對象的子類。
優勢:由於代理類與目標類是繼承關係,因此不須要有接口的存在。
缺點:由於沒有使用接口,因此係統的耦合性沒有使用JDK的動態代理好。
原文:https://blog.csdn.net/cckevincyh/article/details/54962920blog