系列文章
[Head First設計模式]山西面館中的設計模式——裝飾者模式
[Head First設計模式]山西面館中的設計模式——觀察者模式
[Head First設計模式]山西面館中的設計模式——建造者模式
[Head First設計模式]餃子館(冬至)中的設計模式——工廠模式
引言
閑着沒事,終於又拿起Head First設計模式 翻了翻,腦海里也一直在想搶票的事,搶票中使用一些搶票工具,這個搶票工具是否就是一個中間代理呢?
什么是代理?
自己的理解就是有些事排個代表可以去做,自己也可以去做,這個代表就是代理,比如搶票這件事,搶票工具就是個代理,有沒有它,自己一樣可以去買票。
代理模式定義
代理模式為另一個對象提供一個替身或占位符以控制對這個對象的訪問。
使用代理模式創建代表(Representative)對象,讓代表控制某對象的訪問,被代理的對象可以是遠程對象,創建開銷大的對象或需安全控制的對象。
代理模式的類圖
Subject:它為RealSubject和Proxy提供了接口,通過實現同一接口,Proxy在RealSubject出現的地方取代它。
RealSubject是真正做事的對象,它是被proxy代理和控制訪問的對象。
Proxy持有RealSubject的引用。在某些例子中,Proxy還會負責RealSubject對象的創建與銷毀。客戶和RealSubject的交互都必須通過Proxy。因為Proxy和RealSubject實現相同的接口Subject。所以任何用到RealSubject的地方,都可以用Proxy取代。Proxy也控制了對RealSubject的訪問,在某些情況下,我們可能需要這樣的控制。這些情況包括RealSubject是遠程的對象,RealSubject創建開銷大,或RealSubject需要被保護。
搶票的實例
接口
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 namespace Wolfy.代理模式 7 { 8 /// <summary> 9 /// 抽象類subject接口類 搶票工具 ,自己都繼承該抽象類 都具有搶票方法 10 /// </summary> 11 public abstract class BaseWork 12 { 13 /// <summary> 14 /// 搶票方法 15 /// </summary> 16 public abstract void DoForceTick(); 17 } 18 }
搶票工具類
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Wolfy.代理模式 8 { 9 public class TicketTool : BaseWork 10 { 11 MySelf myself; 12 public override void DoForceTick() 13 { 14 if (myself == null) 15 { 16 myself = new MySelf(); 17 } 18 myself.DoForceTick(); 19 } 20 } 21 }
自己
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Wolfy.代理模式 8 { 9 public class MySelf:BaseWork 10 { 11 public override void DoForceTick() 12 { 13 Console.WriteLine("搶一張北京西-鄭州的火車票"); 14 } 15 } 16 }
控制台
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Wolfy.代理模式 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //自己搶票 14 MySelf myself = new MySelf(); 15 myself.DoForceTick(); 16 //搶票工具 17 TicketTool tool = new TicketTool(); 18 tool.DoForceTick(); 19 Console.Read(); 20 } 21 } 22 }
結果
總結
代理模式優點: