使用代理模式來進行C#設(shè)計模式開發(fā)的基礎(chǔ)教程
一、概述
在軟件開發(fā)中,有些對象由于創(chuàng)建成本高、訪問時需要與其它進程交互等原因,直接訪問會造成系統(tǒng)速度慢、復雜度增大等問題。這時可以使用代理模式,給系統(tǒng)增加一層間接層,通過間接層訪問對象,從而達到隱藏系統(tǒng)復雜性、提高系統(tǒng)性能的目的。
二、代理模式的詳細介紹
代理模式為其他對象提供一種代理以控制對這個對象的訪問。其結(jié)構(gòu)圖如下:
Subject定義了RealSubject和Proxy共用的接口,使得在任何使用RealSubject的地方都可以使用Proxy
RealSubject定義了Proxy所代表的實體。
Proxy定義了一個控制RealSubject的代理,供Client使用。
代理模式按照使用目的可以分為以下幾種:
- 遠程(Remote)代理:為一個位于不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是本電腦中,也可以在另一臺電腦中。最典型的例子就是——客戶端調(diào)用Web服務或WCF服務。
- 虛擬(Virtual)代理:根據(jù)需要創(chuàng)建一個資源消耗較大的對象,使得對象只在需要時才會被真正創(chuàng)建。
- Copy-on-Write代理:虛擬代理的一種,把復制(或者叫克?。┩涎拥街挥性诳蛻舳诵枰獣r,才真正采取行動。
- 保護(Protect or Access)代理:控制一個對象的訪問,可以給不同的用戶提供不同級別的使用權(quán)限。
- 防火墻(Firewall)代理:保護目標不讓惡意用戶接近。
- 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調(diào)用的次數(shù)記錄下來等。
- Cache代理:為某一個目標操作的結(jié)果提供臨時的存儲空間,以便多個客戶端可以這些結(jié)果。
在上面所有種類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理較為常見的代理模式。下面讓我們具體看看代理模式的具體定義。
2.1 定義
代理模式——就是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程序的一個代理。
2.2 代理模式實現(xiàn)
看完代理模式的描述之后,下面以一個生活中的例子來解釋下代理模式,在現(xiàn)實生活中,如果有同事出國或者朋友出國的情況下,我們經(jīng)常會拖這位朋友幫忙帶一些電子產(chǎn)品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,由于他朋友不能去國外買東西,他卻可以,所以朋友們都托他幫忙帶一些東西的。下面就以這個場景來實現(xiàn)下代理模式,具體代碼如下:
// 客戶端調(diào)用 class Client { static void Main(string[] args) { // 創(chuàng)建一個代理對象并發(fā)出請求 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(); // 調(diào)用真實主題方法 realSubject.BuyProduct(); this.PostBuyProduct(); } // 代理角色執(zhí)行的一些操作 public void PreBuyProduct() { // 可能不知一個朋友叫這位朋友帶東西,首先這位出國的朋友要對每一位朋友要帶的東西列一個清單等 Console.WriteLine("我怕弄糊涂了,需要列一張清單,張三:要帶相機,李四:要帶Iphone..........."); } // 買完東西之后,代理角色需要針對每位朋友需要的對買來的東西進行分類 public void PostBuyProduct() { Console.WriteLine("終于買完了,現(xiàn)在要對東西分一下,相機是張三的;Iphone是李四的.........."); } }
在上面的代碼中都有相應的注釋,這里也不多解釋了。
三、代理模式的優(yōu)缺點
全面分析完代理模式之后,讓我們看看這個模式的優(yōu)缺點:
優(yōu)點:
代理模式能夠?qū)⒄{(diào)用用于真正被調(diào)用的對象隔離,在一定程度上降低了系統(tǒng)的耦合度;
代理對象在客戶端和目標對象之間起到一個中介的作用,這樣可以起到對目標對象的保護。代理對象可以在對目標對象發(fā)出請求之前進行一個額外的操作,例如權(quán)限檢查等。
缺點:
由于在客戶端和真實主題之間增加了一個代理對象,所以會造成請求的處理速度變慢
實現(xiàn)代理類也需要額外的工作,從而增加了系統(tǒng)的實現(xiàn)復雜度。
相關(guān)文章
WinForm中BackgroundWorker控件用法簡單實例
這篇文章主要介紹了WinForm中BackgroundWorker控件用法,以一個簡單實例形式分析了BackgroundWorker控件的定義、設(shè)置及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08Winform基于多線程實現(xiàn)每隔1分鐘執(zhí)行一段代碼
這篇文章主要介紹了Winform基于多線程實現(xiàn)每隔1分鐘執(zhí)行一段代碼的方法,設(shè)計線程的操作及時間函數(shù)的用法,需要的朋友可以參考下2014-10-10C#中IList<T>與List<T>的區(qū)別深入解析
本篇文章主要是對C#中IList<T>與List<T>的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01