一、概述
在軟件開發中,有些對象由于創建成本高、訪問時需要與其它進程交互等原因,直接訪問會造成系統速度慢、復雜度增大等問題。這時可以使用代理模式,給系統增加一層間接層,通過間接層訪問對象,從而達到隱藏系統復雜性、提高系統性能的目的。
二、代理模式的詳細介紹
代理模式為其他對象提供一種代理以控制對這個對象的訪問。其結構圖如下:
Subject定義了RealSubject和Proxy共用的接口,使得在任何使用RealSubject的地方都可以使用Proxy
RealSubject定義了Proxy所代表的實體。
Proxy定義了一個控制RealSubject的代理,供Client使用。
代理模式按照使用目的可以分為以下幾種:
在上面所有種類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理較為常見的代理模式。下面讓我們具體看看代理模式的具體定義。
2.1 定義
代理模式――就是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程序的一個代理。
2.2 代理模式實現
看完代理模式的描述之后,下面以一個生活中的例子來解釋下代理模式,在現實生活中,如果有同事出國或者朋友出國的情況下,我們經常會拖這位朋友幫忙帶一些電子產品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,由于他朋友不能去國外買東西,他卻可以,所以朋友們都托他幫忙帶一些東西的。下面就以這個場景來實現下代理模式,具體代碼如下:
// 客戶端調用 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是李四的.........."); } }
在上面的代碼中都有相應的注釋,這里也不多解釋了。
三、代理模式的優缺點
全面分析完代理模式之后,讓我們看看這個模式的優缺點:
優點:
代理模式能夠將調用用于真正被調用的對象隔離,在一定程度上降低了系統的耦合度;
代理對象在客戶端和目標對象之間起到一個中介的作用,這樣可以起到對目標對象的保護。代理對象可以在對目標對象發出請求之前進行一個額外的操作,例如權限檢查等。
缺點:
由于在客戶端和真實主題之間增加了一個代理對象,所以會造成請求的處理速度變慢
實現代理類也需要額外的工作,從而增加了系統的實現復雜度。
新聞熱點
疑難解答