1. 程式人生 > >C#設計模式(9)——代理模式

C#設計模式(9)——代理模式

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 override
void 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是代理模式的典型應用。

 代理模式的優點:

  職責清晰,擴充套件性好,很方便對類的訪問進行控制

代理模式的缺點:

  在客戶端和真實主題間加了代理物件,可能造成處理請求的速度變慢。