通過代理完成對業務類的訪問,包一層方便人以功能擴展,
代理模式:VPN代理,翻墻代理,火車票代理等,
通過代理業務類去完成對真實業務類的呼叫,代理類不能擴展業務功能,在不修改RealSubject前提下,插入功能,
包一層:沒有什么技術問題是包一層解決不了的,如果有,那么就再包一層,比如來個日志記錄,可以避免修改業務類,只需要修改代理類,在來個例外處理;在來個性能提成----快取結果........
通過代理,能夠為物件擴展功能(不是增加業務)而不去修改原始業務類,也就是包了一層,我的地盤聽我的
/// <summary> /// 業務介面 /// </summary> public interface ISubject { /// <summary> /// get /// </summary> /// <returns></returns> bool GetSomething(); /// <summary> /// do /// </summary> void DoSomething(); }

public class ProxySubject : ISubject{ //組合一下 private static ISubject _Subject = new RealSubject(); public void DoSomething() { try { Console.WriteLine("prepare DoSomething..."); _Subject.DoSomething(); } catch (Exception ex) { Console.WriteLine(ex.Message); throw ex; } } private static Dictionary<string, bool> ProxyDictionary = new Dictionary<string, bool>(); public bool GetSomething() { try { Console.WriteLine("prepare GetSomething..."); string key = "Proxy_GetSomething"; bool bResult = false; if (!ProxyDictionary.ContainsKey(key)) { bResult = _Subject.GetSomething(); ProxyDictionary.Add(key, bResult); } else { bResult = ProxyDictionary[key]; } return bResult; } catch (Exception ex) { Console.WriteLine(ex.Message); throw ex; } }}View Code

/// <summary>/// 一個耗時耗資源的物件方法/// 一個第三方封裝的類和方法/// </summary>public class RealSubject : ISubject{ public RealSubject() { Thread.Sleep(2000); long lResult = 0; for (int i = 0; i < 100000000; i++) { lResult += i; } Console.WriteLine("RealSubject被構造,,,"); } /// <summary> /// 火車站查詢火車票 /// </summary> public bool GetSomething() { Console.WriteLine("坐車去火車站看看余票資訊,,,"); Thread.Sleep(3000); Console.WriteLine("到火車站,看到是有票的"); return true; } /// <summary> /// 火車站買票 /// </summary> public void DoSomething() { Console.WriteLine("開始排隊,,,"); Thread.Sleep(2000); Console.WriteLine("終于買到票了,,,"); }}View Code
呼叫一下:

{ Console.WriteLine("***********Real**************"); ISubject subject = new RealSubject(); subject.GetSomething(); //subject.DoSomething(); } { Console.WriteLine("***********Proxy**************"); ISubject subject = new ProxySubject(); subject.GetSomething(); //subject.DoSomething(); } { Console.WriteLine("***********Proxy**************"); ISubject subject = new ProxySubject(); subject.GetSomething(); //subject.DoSomething(); }View Code
呼叫下看下結果:

通過代理,能夠為物件擴展功能(不是增加業務),而不是去修改原始業務類,就是包一層,
WebService就是代理模式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/46487.html
標籤:設計模式
上一篇:設計模式-配接器模式

