重學設計模式 - Proxy(代理)模式 - 結構型

1、意圖

  • 爲其他對象提供一種代理以控制對這個對象的訪問

2、動機

  • 爲了只有在確實需要這個對象時纔對它進行創建和初始化。提高程序響應速度。

3、適用性

  • 遠程代理(Remote Proxy) 爲一個對象在不同的地址空間提供局部代表。
  • 虛代理(Virtual Proxy)爲開銷很大的對象創建代理,使之可以按需創建。
  • 保護代理(Protection Proxy) 控制對原始對象的訪問。用於對象應該有不同的訪問權限的時候。
  • 智能指引(Smart Reference) 取代簡單的指針,它在訪問對象時執行一些附加的操作。其典型用途包括:
    • Smart Pointers:對指向實際對象的引用計數,當該對象沒有引用時,自動釋放它。
    • 當第一次引用一個持久對象時,將它裝入內存。
    • 在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其他對象不能使用它。

4、結構

 

這是運行時刻一種可能的代理結構的對象圖:

 

5、參與者

  • Proxy
    - 保存一個引用,使得代理可以訪問實體。若RealSubject和Subject接口相同,Proxy會引用Subject。
    - 提供一個與Subject的接口相同的接口,這樣代理就可以用來代替實體。
    - 控制對實體的存取,並可能負責創建和釋放它。
    - Remote Proxy 負責對其請求及其參數進行編碼,並向不同地址空間的實體發送已編碼的請求。
    - Virtual Proxy 可以緩存實體的附加信息,以便延遲對它的訪問。
    - Protection Proxy 檢查調用者是否具有實現一個請求所必須的訪問權限。
  • Subject
    - 定義RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。
  • RealSubject
    - Proxy所代表的實體

6、協作

  • 代理根據其種類,在適當的時機向Realsubject轉發請求。

7、效果

  • Proxy模式在訪問對象時引入了一定程度的間接性。根據代理的類型,附加的間接性有多種用途:
    1)Remote Proxy 可以隱藏一個對象存在於不同地址空間的事實。
    2)Virtual Proxy 可以進行最優化,比如延遲對象創建。
    3)Protection Proxy 和 Smart Reference 都允許在訪問一個對象時有一些附加的內務處理。
  • Proxy模式還可以對用戶隱藏另一種稱之爲Copy-on-Write的優化方式,該優化與根據需要創建對象有關(Virtual Proxy)。
       拷貝一個複雜且龐大的對象是一種開銷很大的操作,如果這個對象拷貝根本沒有被修改,那麼這些開銷就沒有必要。用代理延遲這一拷貝過程,我們可以保證只有當這個對象被修改時纔對它進行拷貝。
      在實現copy-on-write時必須對實體進行引用計數。拷貝代理僅會增加引用計數。只有當用戶請求一個修改該實體的操作時,代理纔會真正的拷貝它。在這種情況下,代理還必須減少實體的引用計數。當引用的數目爲0時,這個實體將被刪除。
      Copy-on-Write可以大幅度的降低拷貝龐大實體時的開銷。

8、實現

  • 重載C++中的存取運算符(-> 和 *) 重載這一運算符使你可以在撤銷對一個對象的引用時執行一些附加操作。此時,代理的作用就像一個指針。
  • 人工實現每一個代理操作,向實體轉發請求。一般來說,所有的操作在向實體轉發請求前都需要檢驗這個要求是否合法,原始對象是否存在等。
  • Proxy並不總是需要知道實體的類型 若Proxy類能夠完全通過抽象接口處理它的實體,則無須爲每一個Realsubject類都生成一個Proxy類;Proxy類可以統一處理所有的Realsubject實體。但是如果Proxy類要實例化RealSubject,則需要知道其具體類型。
  • 在實例化實體以前如何引用它?

9、相關模式

  • Adapter:適配器Adapter爲它所適配的對象提供一個不同的接口。而代理提供的接口是實體接口的一個子集。
  • Decorator:Decorator爲對象添加一個或多個功能,而代理則控制對象的訪問。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章