[Head First設計模式]搶票中的設計模式——代理模式


 系列文章

[Head First設計模式]山西面館中的設計模式——裝飾者模式

[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 }

結果

 總結

代理模式優點:

(1).職責清晰
真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過后期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。
(2).代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了的作用和保護了目標對象的作用。
(3).高擴展性
代理模式的分類:遠程(Remote)代理,虛擬(Virtual)代理,Copy-on-Write代理,智能引用(Smart Reference)代理。
各代理的具體說明,請參考: http://www.cnblogs.com/rush/archive/2011/06/19/2084775.html
 
如若對該模式的理解有誤,請留言,討論一下,共同學習=進步,謝謝
 
參考書:
Head First 設計模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM