代理模式(Proxy Pattern)也叫委托模式,是一個使用率非常高的模式。 定義: 為其他對象提供一種代理以控制對這個對象的訪問。 代理模式是一項基本的設計技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上也採用了代理模式。類圖如下所示。 代理模式提供以下3個角色。 抽象主題(Subj ...
代理模式(Proxy Pattern)也叫委托模式,是一個使用率非常高的模式。
定義:
- 為其他對象提供一種代理以控制對這個對象的訪問。
代理模式是一項基本的設計技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上也採用了代理模式。類圖如下所示。
代理模式提供以下3個角色。
- 抽象主題(Subject)角色:是真實主題和代理主題的共同介面,以便在任何可以使用真實主題的地方都可以使用代理主題。
- 代理主題(Proxy Subject)角色:也叫委托類、代理類,該角色負責控制對真實主題的引用,負責在需要的時候創建或刪除真實主題對象,並且在真實主題角色處理完畢前後做預處理和善後處理工作。
- 真實主題(Real Subject)角色:該角色也叫做委托角色、被代理角色,是業務邏輯的具體執行者。
Subject.java
public interface Subject { // 定義一個請求方法 public void request(); }
RealSubject.java模式
public class RealSubject implements Subject { @Override public void request() { // 業務邏輯處理 } }
ProxySubject.java
public class ProxySubject implements Subject { private Subject subject; public ProxySubject(Subject subject) { this.subject = subject; } @Override public void request() { this.beforeRequest(); this.subject.request(); this.afterRequest(); } // 請求前的操作 private void beforeRequest() { // 預處理 } // 請求後的操作 private void afterRequest() { // 善後處理 } }
一個代理主題類可以代理多個真實主題,具體代理哪個真實主題是由高層的應用模塊決定的,可以通過代理類的構造函數傳遞被代理者。
代理模式的各類
- 遠程(Remote)代理:為一個位於不同地址空間的對象提供一個局部代表對象。這個不同的地址空間可以是在本機器中,也可以在另一臺機器上。
- 虛擬(Virtual)代理:有時需要創建一些消耗較多資源的對象,可以首先創建代理對象,而將真實對象的創建延遲。例如,載入一個很大的圖片,可以通過圖片的代理來替代真正的圖片。
- 保護(Protect or Access)代理:控制一個對象的訪問,如果需要,可以給不同的用戶提供不同級別的使用許可權。
- 緩存(Cache)代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共用這些結果。
- 同步(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有衝突。
- 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,例如,記錄訪問的流量和次數等。
註意:在所有各類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理是最為常見的代理模式。
優點:
- 職責清晰:真實的角色實現實際的業務邏輯,不用關心其他非本職的事務,通過附加的代理完成附加的事務,附加的結果就是編程簡潔清晰。
- 高擴展性:具體主題角色隨需求不同可能有很多種,但只要實現了介面,代理類就完全可以在不做任何修改的情況下代理各種真實主題角色。
- 智能化:代理類可以在運行時才確定要去代理的真實主題,這是一個強大的功能。
應用場景:
- 代理模式應用非常廣泛,大到一個系統框架、企業平臺,小到事務處理、代碼片段,隨處可見代理模式的使用,例如,Java RMI的遠程調用就是一種代理模式的應用,現在流行的AOP也可以通過代理模式實現。
摘自:
青島東合信息技術有限公司 . 設計模式(Java版) . 電子工業出版社,2012,73-76.