在軟件開發過程中,有些對象有時候會由於網絡或其他的障礙,以至於不能夠或者不能直接訪問到這些對象,如果直接訪問對象給系統帶來不必要的復雜性,這時候可以在客戶端和目標對象之間增加一層中間層,讓代理對象代替目標對象,然後客戶端只需要訪問代理對象,由代理對象去幫我們去請求目標對象並返回結果給客戶端,這樣的一個解決思路就是今天要介紹的代理模式。
一、 代理(Proxy)模式
代理模式按照使用目的可以分為以下幾種:
在上面所有種類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理較為常見的代理模式。下面讓我們具體看看代理模式的具體定義:
代理模式——就是給某一個對象提供一個代理,並由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程序的一個代理。
二、 代理模式的類圖
在上面類圖中,代理模式所涉及的角色有三個:
附:在實際開發過程中,我們在客戶端添加服務引用的時候,在客戶程序中會添加一些額外的類,在客戶端生成的類扮演著代理主題角色,我們客戶端也是直接調用這些代理角色來訪問遠程服務提供的操作。這個是遠程代理的一個典型例子。
三、 代理模式的實現
下面以一個生活中的例子來解釋下代理模式,在現實生活中,如果有同事出國或者朋友出國的情況下,我們經常會拖這位朋友幫忙帶一些電子產品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,由於他朋友不能去國外買東西,他卻可以,所以朋友們都托他幫忙帶一些東西的。下面就以這個場景來實現下代理模式,具體代碼如下:
// 客戶端調用 using System; class Client { static void Main(string[] args) { // 創建一個代理對象並發出請求 Person proxy = new Friend(); proxy.BuyProduct(); Console.Read(); } } // 抽象主題角色 public abstract class Person { public abstract void BuyProduct(); } //真實主題角色 public class RealBuyPerson : Person { public override void BuyProduct() { Console.WriteLine("幫我買一個IPhone和一台蘋果電腦"); } } // 代理角色 public class Friend : Person { // 引用真實主題實例 RealBuyPerson _realSubject; public override void BuyProduct() { Console.WriteLine("通過代理類訪問真實實體對象的方法"); if (_realSubject == null) { _realSubject = new RealBuyPerson(); } this.PreBuyProduct(); // 調用真實主題方法 _realSubject.BuyProduct(); this.PostBuyProduct(); } // 代理角色執行的一些操作 public void PreBuyProduct() { // 可能不知一個朋友叫這位朋友帶東西,首先這位出國的朋友要對每一位朋友要帶的東西列一個清單等 Console.WriteLine("我怕弄糊塗了,需要列一張清單,張三:要帶相機,李四:要帶Iphone..........."); } // 買完東西之後,代理角色需要針對每位朋友需要的對買來的東西進行分類 public void PostBuyProduct() { Console.WriteLine("終於買完了,現在要對東西分一下,相機是張三的;Iphone是李四的.........."); } }
在上面的代碼中都有相應的注釋,這裡也不多解釋了。
四、 代理模式的優缺點
優點:
缺點:
五、 總結
到這裡,代理模式的介紹就結束了,代理模式提供了對目標對象訪問的代理。