C#設計模式之代理設計模式(Proxy)

來源:互聯網
上載者:User

代理(Proxy)模式給某一個對象提供一個代理,並由代理對象控制對原對象的引用。

代理模式的英文叫做Proxy或Surrogate,中文都可譯成"代理"。所謂代理,就是一個人或者一個機構代表另一個人或者另一個機構採取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在用戶端和目標對象之間起到中介的作用。

二、代理的種類

如果按照使用目的來劃分,代理有以下幾種:

遠程(Remote)代理:為一個位於不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是在本機器中,也可是在另一台機器中。遠程代理又叫做大使(Ambassador)。

虛擬(Virtual)代理:根據需要建立一個資源消耗較大的對象,使得此對象只在需要時才會被真正建立。

Copy-on-Write代理:虛擬代理的一種。把複製(複製)拖延到只有在用戶端需要時,才真正採取行動。

保護(Protect or Access)代理:控制對一個對象的訪問,如果需要,可以給不同的使用者提供不同層級的使用許可權。

Cache代理:為某一個目標操作的結果提供臨時的儲存空間,以便多個用戶端可以共用這些結果。

防火牆(Firewall)代理:保護目標,不讓惡意使用者接近。

同步化(Synchronization)代理:使幾個使用者能夠同時使用一個對象而沒有衝突。

智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。

在所有種類的代理模式中,虛擬(Virtual)代理、遠程(Remote)代理、智能引用代理(Smart Reference Proxy)和保護(Protect or Access)代理是最為常見的代理模式。

三、遠程代理的例子

Achilles是一個用來測試網站的安全效能的工具軟體。Achilles相當於位於用戶端的的一個案頭Proxy 伺服器,在一個HTTP過程裡起到一個中間人的作用,但是Achilles與通常的Proxy 伺服器又有不同。Achilles截獲雙向的通訊資料,使得Achilles軟體的使用者可以改變來自和發往網路伺服器的資料,甚至可以攔截並修改SSL通訊。(這點在《Java與模式》中解釋的不是很清楚,關於對非對稱金鑰密碼編譯攔截、破解方法,可以參考我的另外一篇文章《通過代理截取並修改非對稱金鑰密碼編譯資訊》)。

另外一個例子就是Windows的捷徑。捷徑是它所引用的程式的一個代理。

四、代理模式的結構

代理模式的類圖如下圖所示:

代理模式所涉及的角色有:

抽象主題角色(Subject):聲明了真實主題和代理主題的共同介面,這樣一來在任何使用真實主題的地方都可以使用代理主題。

代理主題(Proxy)角色:代理主題角色內部含有對真是主題的引用,從而可以在任何時候操作真實主題對象;代理主題角色提供一個與真實主題角色相同的介面,以便可以在任何時候都可以替代真實主體;控制真實主題的應用,負責在需要的時候建立真實主題對象(和刪除真實主題對象);代理角色通常在將用戶端調用傳遞給真實的主題之前或之後,都要執行某個操作,而不是單純的將調用傳遞給真實主題對象。

真實主題角色(RealSubject)角色:定義了代理角色所代表的真實對象。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.