1. 程式人生 > >c#設計模式之代理模式(Proxy Pattern)

c#設計模式之代理模式(Proxy Pattern)

ole 購物 click size ont 業務 添加 .html 售票

引言

代理這個詞語,大家在現實世界已經頻繁的接觸過,例如火車站代理售票點,因為這些代理售票點的存在,我們不必要去火車站的售票處就可以查詢或者取到火車票.代理點本身是沒有能力生產車票的,我們在代理處享受到的其實就是火車站售票處的服務,同時我們還能夠在代理點享受到火車站售票處沒有的服務,例如代理點有個自動售貨機,我們還能夠享受到購物的服務.這就是代理的優勢所在

在設計模式中也有那麽一種模式,與代理這個定義緊密相連,下面我將以最簡潔的代碼展示它

技術分享圖片
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)