1、概述
爲其它對象提供一種代理以控制對這個對象的訪問。
解決的問題:如果直接訪問對象比較困難,或直接訪問會給使用者或系統帶來一系列問題。這樣對於客戶端(調用者)來說,就不需要直接與真實對象進行交互,解除了調用者與真實對象的耦合。
2、模式中的角色
- 抽象實體(Subject):定義了真實實體(RealSubject)和代理(Proxy)的公共接口,這樣就在任何時候使用真實實體(RealSubject)的地方使用代理(Proxy)。
- 代理(Proxy):保存一個引用使得代理可以直接訪問真實實體,並提供一個與Subject的接口相同的接口,這樣代理就可以代替真實實體。
- 真實實體(RealSubject):定義Proxy所代表的真實實體。
3、結構圖
4、代碼實現
// 抽象實體,定義真實實體與代理的公共接口
public interface ISubject{
void Function1();
void Function2();
}
// 真實實體,真正的功能實現者
public class RealSubject implements ISubject{
public void Function1() {
//業務方法具體實現代碼
}
public void Function2() {
//業務方法具體實現代碼
}
}
//代理,用來訪問真實的實體
public class Proxy implements ISubject{
// 保存一個真實實體,用以在代理中訪問真實實體的功能。
private RealSubject realSubject;
public Proxy(){
realSubject = new RealSubject();
}
// 實現與Subject相同的接口,實際調用的是RealSubject的Function1()
public void Function1() {
realSubject.Function1();
}
public void Function2(){
realSubject.Function2();
}
}
具體調用:
// 實例化代理
ISubject subjectProxy = new Proxy();
// 通過代理調用具體功能
subjectProxy.Function1();
subjectProxy.Function2();
5、使用場景
- 遠程代理: 爲一個位於不同地址空間的的對象提供一個本地的代理。
- 虛擬代理:如果需要創建一個消耗較大的對象,先創建一個消耗較小的對象來表示,真實對象只在需要時才被真實創建。
- 安全代理:用來控制對真實對象的訪問權限
- 智能指引:當調用真實對象時,代理提供一些額外的操作。如將對象被操作的次數記錄起來等。
- 緩衝代理:爲某一個目標操作提供臨時的存儲空間,以便更多客戶端共享此結果。
- 防火牆代理:保護目標不讓惡意用戶接近。
- 同步化代理:使幾個用戶能同時使用一個對象而沒有衝突。
參考文章代理模式和設計模式學習筆記-代理模式。