C#設計模式(9)——代理模式
阿新 • • 發佈:2018-11-24
1.代理模式介紹
在軟體開發中有時會遇到不能直接使用物件的問題,如我們要使用的物件在程序外,甚至在遠端的機器上,但是我們要使用這個物件的功能怎麼辦呢?代理模式就可以用來解決這個問題。舉一個生活中的例子:一個害羞男孩追求一個叫如花的女孩,但是自己不敢送禮物,就找了一個朋友代理他給如花送禮物。就以這個例子介紹代理模式的角色:
抽象主題角色:定義了真實主題和代理主題的公共介面,害羞男孩和他的朋友都有給如花送禮物的功能
代理主題角色:害羞男孩的朋友,我們程式碼中直接使用的物件,通過代理物件我們可以呼叫真實物件的功能
真實主題角色:害羞男孩,我們真正要使用的物件
代理模式也經常用於對物件的訪問做一些控制,如男孩的朋友比較熱心,送禮物前會先判斷如花是不是個好人,如果如花不是個好人他就不替害羞男孩送禮物給如花了。
程式碼實現
/// <summary> /// 送禮物的人 (抽象主題角色) /// </summary> public abstract class GiveGiftPerson { //送禮物功能 public abstract void GiveGift(); } /// <summary> /// 害羞男孩 (真實主題角色) /// </summary> public class ShyBoy : GiveGiftPerson {public override void GiveGift() { Console.WriteLine("害羞男孩送禮物給如花~~"); } } /// <summary> /// 害羞男孩的朋友(代理主題角色) /// </summary> public class Friend : GiveGiftPerson { //引用真實主題例項 ShyBoy shyboy = new ShyBoy(); public overridevoid GiveGift() { //朋友一頓分析後,覺得如花是個好人 bool IsRuhuaGood = true; if (IsRuhuaGood) { //呼叫真實主題的方法 shyboy.GiveGift(); } } }
客戶端呼叫:
class Program { static void Main(string[] args) { //因為不能直接訪問到真實物件所以我們不能直接new ShyBoy()去送禮物。 //程式碼中使用的是代理物件 Friend friend = new Friend(); friend.GiveGift(); Console.ReadKey(); } }
程式執行如下:
2.小結
上邊例子的類圖
代理模式的使用場景:
當我們不能直接訪問所需類,或者我們想對類的訪問做一些控制時使用。WCF是代理模式的典型應用。
代理模式的優點:
職責清晰,擴充套件性好,很方便對類的訪問進行控制
代理模式的缺點:
在客戶端和真實主題間加了代理物件,可能造成處理請求的速度變慢。