c#設計模式之代理模式(Proxy Pattern)
引言
代理這個詞語,大家在現實世界已經頻繁的接觸過,例如火車站代理售票點,因為這些代理售票點的存在,我們不必要去火車站的售票處就可以查詢或者取到火車票.代理點本身是沒有能力生產車票的,我們在代理處享受到的其實就是火車站售票處的服務,同時我們還能夠在代理點享受到火車站售票處沒有的服務,例如代理點有個自動售貨機,我們還能夠享受到購物的服務.這就是代理的優勢所在
在設計模式中也有那麽一種模式,與代理這個定義緊密相連,下面我將以最簡潔的代碼展示它
1 /// <summary> 2 /// 業務抽象 3 /// </summary> 4 public業務抽象interface ISubject 5 { 6 void GetTicket(); 7 }
1 /// <summary> 2 /// 真正的邏輯對象 3 /// </summary> 4 public class RealSubject : ISubject 5 { 6 public void GetTicket() 7 { 8 Console.WriteLine(".....取票動作....."真實業務); 9 } 10 }
1 /// <summary> 2 /// 真正業務對象的代理 3 /// </summary> 4 class ProxySubject:ISubject 5 { 6 private static ISubject _subject = null; 7 8 void ProxySubject_Init() 9 { 10 if (_subject == null) 11代理業務{ 12 _subject = new RealSubject(); 13 } 14 } 15 16 public void GetTicket() 17 { 18 if (_subject == null) 19 { 20 ProxySubject_Init(); 21 } 22 //AOP:日誌,緩存,權限,延遲,異常 23 _subject.GetTicket(); 24 } 25 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var proxy = new ProxySubject(); 6 proxy.GetTicket(); 7 Console.ReadKey(); 8 } 9 }打印
觀察上述代碼我們發現它有以下特點
1上端調用的不是真實的業務對象,而是它的一個代理,真實的業務邏輯被隔離
2在代理之內,我們還能額外的定義其他的邏輯,而不影響真實的業務邏輯
這就是一個代理模式
當我們不想或不能直接調用一個業務邏輯對象,我們可以在它之上添加一個代理, 用來屏蔽具體的業務邏輯或者增加額外的業務
代理模式
因為代理本身就是一個比較簡潔的思想,所以代理模式的類圖也比較簡單,如下:
代理模式中有三種角色:
主題的抽象角色(ISubject):真實主題和代理主題的抽象
真實的主題角色(RealSubject):真實主題,提供最根本的業務邏輯
主題的代理角色(ProxySubject):真實主題的代理,能夠引用真實主題,同時添加一些額外的功能
註意:提供業務邏輯的是真實主題,而不是代理,代理只是起到引用的作用,同時可以增加一些額外的功能
相交裝飾器模式
在設計模式裏面,有一種設計模式叫做裝飾器模式,它能夠動態的為對象添加功能,
如果對這兩種模式都有所了解的話,會發現他們其實有很多共同之處,同樣都是具體對象與輔助對象依賴抽象的方式
例如,我們想為對象添加一個日誌的功能:我們既可以選擇為它添加一個代理來實現,也可以選擇添加一個裝飾器來實現,這個時候我們可能會迷惑,添加的到底是代理還是裝飾器
對於它們的區別,從他們出發的場景來比較是最好的,從出發場景來看,裝飾器模式註重的是對原有對象功能的擴展,而代理模式註重的是對原有對象的控制或屏蔽,個人覺得這是他們最大的區別
適用場景
當我們不想或不能直接調用一個業務邏輯對象,我們可以在它之上添加一個代理, 用來屏蔽具體的業務邏輯或者增加額外的業務
優點:
1降低了系統的耦合度,這是設計模式比較共通的優點;
2能夠屏蔽真實的業務邏輯,同時還能額外增加功能
缺點
使用了代理模式,需要增加代理類,必然會增加系統的復雜程度
出自:博客園-半路獨行
原文地址:https://www.cnblogs.com/banluduxing/p/9267705.html
本文出自於http://www.cnblogs.com/banluduxing 轉載請註明出處。
c#設計模式之代理模式(Proxy Pattern)