1、定義
Provide a surrogate or placeholder for another object to control access to it.(爲其餘對象提供一種代理以控制對這個對象的訪問。)java
2、基本組成
(一)類圖

(二)角色定義
- Subject抽象主題角色。抽象主題類能夠是抽象類也能夠是接口,是一個最普通的業務類型定義,無特殊要求
- RealSubject具體主題角色。也叫作被委託角色、被代理角色。是業務邏輯的具體執行者。
- Proxy代理主題角色。也叫作委託類、代理類。它負責對真實角色的應用,把全部抽象主題類定義的方法限制委託給真實主題角色實現,而且在真實主題角色處理完畢先後作預處理和藹後處理工做。一個代理類能夠代理多個被委託者或被代理者。
3、代理方式與實現
- 普通代理。客戶端能夠指定代理類對象,其實現爲客戶端建立被代理對象,而後將被代理對象注入代理對象,用代理對象去執行業務。
- 強制代理。客戶端只能使用業務對象規定的代理對象,其實現爲客戶端建立被代理對象,經過被代理對象獲取代理對象,而後用代理對象去執行業務。
4、說一說動態代理
代理模式的高級應用是動態代理。動態代理的優點在於相較於普通的使用代理模式須要爲每一個具體類建立一個類,而動態代理是動態的生成代理類而不須要定義代理類。ide
(一)動態代理的兩種方式
- JDK提供的java.lang.reflect.Proxy動態代理
- cglib庫
二者的區別在於:3d
- 實現原理的區別:jdk是基於業務類實現的接口動態生成代理類定義,而後將代理類方法的實現轉發給InvocationHanlder(InvocationHanlder需先注入被代理對象),而cglib是基於繼承動態生成其子類,而後重寫其子類方法來實現的。
- 限制上的區別:jdk限制被代理類必須實現接口,而cglib沒有這個限制。
- 建立的對象個數不一樣:由於原理的不一樣,jdk須要實例化兩個對象,而cglib只實例化一個對象。
(二)基於動態代理的代理模式(以jdk方式爲例)
類圖:代理

其中,動態代理DynamicProxy實現代理的職責,業務邏輯Subject實現相關的邏輯功能。日誌
3、代理模式的優勢
在不改變原方法的基礎上經過代理提供訪問控制、日誌記錄等等,與業務邏輯相獨立,符合單一職責原則。對象
4、與裝飾器模式的區分
裝飾器是對原接口起到了"裝飾"做用,多是增長了新接口、修改了原有的行爲等,代理通常不改變接口。blog