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