設計模式----代理模式

守望陽光01發表於2019-04-21

        今天,我們來說說代理模式,所謂代理,就是代理啦(哈哈),現實世界裡,我們常常會聽過什麼拿下某某代理,今天我們要講的也是這種代理,在程式的世界裡,我們可以稱之為封裝(也就是包一層),好,廢話不多說,直接擼程式碼。。

/// <summary>
    /// 業務介面
    /// </summary>
    public interface ISubject
    {
        /// <summary>
        /// get
        /// </summary>
        /// <returns></returns>
        bool GetSomething();
        /// <summary>
        /// DO
        /// </summary>
        void DoSomething();
    }

        還是原來的故事,先定義一個抽象業務介面,兩個方法,一個返回bool型別,一個不返回,這麼簡單就無需再廢話了。。。接下來,按照劇本的走向下一步就是去實現,好,我們再接著擼下一個。。

public class RealSubject : ISubject
    {
        public RealSubject()
        {
            Thread.Sleep(2000);
            long lResult = 0;
            for (int i = 0; i < 10000000; i++)
            {
                lResult += i;
            }
            Console.WriteLine("RealSubject被構造。。。。");
        }

        public void DoSomething()
        {
            Console.WriteLine("開始排隊了。。。");
            Thread.Sleep(2000);
            Console.WriteLine("終於買到票了。。。");
        }

        public bool GetSomething()
        {
            Console.WriteLine("坐車去火車站看看餘票資訊。。。");
            Thread.Sleep(3000);
            Console.WriteLine("到火車站,看到是有票的");
            return true;
        }
    }

        RealSubject類,我們實現了Isubject介面,這裡我們模擬的是買票情景,我們看RealSubject類的建構函式,這裡我們是模擬去火車站購票難的感受,想想以前沒有網路購票的年代,要買一張火車票是多麼的艱難啊(咳咳,雖然我也沒體驗過,哈哈),反正就是這麼個意思,讓這個物件建立變得異常的長,然後我們實現了介面的兩個方法,模擬排隊買票和去火車站查票的動作。這個就是我們今天的被代理人了,接下來,按部就班的我們就應該建立一個代理人了,擼起袖子程式碼碼起來。。。

public class ProxySubject : ISubject
    {
        private ISubject _iSubject = null;// new RealSubject();

        private static bool _BooleanResult = false;
        private static bool _IsInit = false;

        private void Init()
        {
            this._iSubject = new RealSubject();
        }

        private void Structure()
        {
            if (this._iSubject == null)
            {
                this.Init();
            }
        }
        /// <summary>
        /// 買票
        /// </summary>
        public void DoSomething()
        {
            Console.WriteLine("開始為您購票,請稍後!");
            if (this.GetSomething()) this._iSubject.DoSomething();
        }

        /// <summary>
        /// 火車站查詢火車票
        /// </summary>
        /// <returns></returns>
        public bool GetSomething()
        {
            Console.WriteLine("正在為您查詢餘票,請稍後");
            this.Structure();
            if (!_IsInit)
            {
                _BooleanResult = this._iSubject.GetSomething();
                _IsInit = true;
            }
            Console.WriteLine("已為您查詢到有票哦!");
            return _BooleanResult;
        }
    }

        ProxySubject類同樣繼承Isubject介面,被代理人和代理人核心業務是相同的咯,但是代理人嘛,當然也會包裝自己,讓自己的業務被更多人去使用撒。。好,我們看程式碼,我們首先看Init方法,這裡就是建立一個被代理人,這裡就是拿下代理的意思(哈哈),然後是Structure方法,這裡就是判斷有沒有拿下代理,拿下了就不要重複拿了嘛,畢竟拿人家的代理是要收費的嘛,不能傻到送錢給人家撒。。額,其實是因為我們上面模擬了建立RealSubject類是需要N多資源的,或者是需要太多的IO操作(其實這裡就是單例模式的效果),

然後,他同樣實現介面的兩個方法,因為這是業務的核心,也就是說,以後如果你想買票,直接就找他,然後由他去幫你去火車站購票查票。。好了,代理模式的骨架說完了,最後,我們看看呼叫

static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("*************Proxy1************");
                ISubject subject = new ProxySubject();
                subject.GetSomething();
                subject.DoSomething();
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }

        首先,我們new一個ProxySubject物件,這裡注意,我們new的時候是還沒有去建立RealSubject物件的,只有在使用DoSomething方法和GetSomething方法時才會真正的去建立RealSubject物件,來,讓我們把程式碼跑起來看看效果。。

        這裡紅線圈起來的是被代理的邏輯,其他是我們代理的邏輯。所以說,代理模式其實就是我們所謂的包一層,它的主要業務邏輯是不可改變的,但是在代理中,我們可以把多個業務組合再一起形成新的業務,但是最終影響的結果肯定是一致的。。。

        好了,今天的代理模式就學完了。。。還不懂的同學多擼幾遍程式碼就OK了。。。

 

相關文章