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