沈鵬
摘要:代理模式是常用的結構型設計模式之一,當無法直接訪問某個對象或訪問某個對象存在困難時可以通過一個代理對象來間接訪問,為了保證客戶端使用的透明性,所訪問的真實對象與代理對象需要實現相同的接口。根據代理模式的使用目的不同,代理模式又可以分為多種類型,例如保護代理、遠程代理、虛擬代理、緩沖代理等,它們應用于不同的場合,滿足用戶的不同需求。
關鍵詞:C#;設計模式;代理模式
一、代理模式概述
代理模式的英文叫做Proxy或Surrogate,中文都可譯成"代理"。所謂代理,就是一個人或者一個機構代表另一個人或者另一個機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式是常用的結構型設計模式之一,當無法直接訪問某個對象或訪問某個對象存在困難時可以通過一個代理對象來間接訪問,為了保證客戶端使用的透明性,所訪問的真實對象與代理對象需要實現相同的接口。代理(Proxy)模式給某一個代理模式是一種對象結構型模式。在代理模式中引入了一個新的代理對象,代理對象在客戶端對象和目標對象之間起到中介的作用,它去掉客戶不能看到的內容和服務或者增添客戶需要的額外的新服務。
二、代理模式的種類
如果按照使用目的來劃分,代理有以下幾種:
遠程(Remote)代理:為一個位于不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是在本機器中,也可是在另一臺機器中。遠程代理又叫做大使(Ambassador)。
虛擬(Virtual)代理:根據需要創建一個資源消耗較大的對象,使得此對象只在需要時才會被真正創建。
Copy-on-Write代理:虛擬代理的一種。把復制(克隆)拖延到只有在客戶端需要時,才真正采取行動。
保護(Protect or Access)代理:控制對一個對象的訪問,如果需要,可以給不同的用戶提供不同級別的使用權限。
Cache代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。
防火墻(Firewall)代理:保護目標,不讓惡意用戶接近。
同步化(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有沖突。
智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
在所有種類的代理模式中,虛擬(Virtual)代理、遠程(Remote)代理、智能引用代理(Smart Reference Proxy)和保護(Protect or Access)代理是最為常見的代理模式。
三、遠程代理的例子
Achilles是一個用來測試網站的安全性能的工具軟件。Achilles相當于位于客戶端的的一個桌面代理服務器,在一個HTTP過程里起到一個中間人的作用,但是Achilles與通常的代理服務器又有不同。Achilles截獲雙向的通信數據,使得Achilles軟件的用戶可以改變來自和發往網絡服務器的數據,甚至可以攔截并修改SSL通訊。另外一個例子就是Windows的快捷方式。快捷方式是它所引用的程序的一個代理。
四、代理模式結構與實現
代理模式的結構比較簡單,其核心是代理類,為了讓客戶端能夠一致性地對待真實對象和代理對象,在代理模式中引入了抽象層。
代理模式包含如下三個角色:
Subject(抽象主題角色):它聲明了真實主題和代理主題的共同接口,這樣一來在任何使用真實主題的地方都可以使用代理主題,客戶端通常需要針對抽象主題角色進行編程。
Proxy(代理主題角色):它包含了對真實主題的引用,從而可以在任何時候操作真實主題對象;在代理主題角色中提供一個與真實主題角色相同的接口,以便在任何時候都可以替代真實主題;代理主題角色還可以控制對真實主題的使用,負責在需要的時候創建和刪除真實主題對象,并對真實主題對象的使用加以約束。通常,在代理主題角色中,客戶端在調用所引用的真實主題操作之前或之后還需要執行其他操作,而不僅僅是單純調用真實主題對象中的操作。
在實際開發過程中,代理類的實現比上述代碼要復雜很多,代理模式根據其目的和實現方式不同可分為很多種類。
參考文獻
[1] 林舒萍,羅鍵.設計模式的應用研究[J]. 計算機工程與設計. 2005(11)
[2] 陳智.在VB.NET中使用設計模式[J]. 甘肅科技. 2006(10)
[3] 夏浩波.單例模式的設計與應用[J]. 電腦開發與應用. 2011(01)
[4]丁中文,王懷軍.在C#中使用設計模式科技創新導報[J]. 2007(12)