抢票中的设计模式——代理模式

引言

闲着没事,终于又拿起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需要被保护。

抢票的实例

接口

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 namespace Wolfy.代理模式
 {
     /// <summary>
     /// 抽象类subject接口类  抢票工具 ,自己都继承该抽象类 都具有抢票方法
     /// </summary>
     public abstract class BaseWork
     {
         /// <summary>
         /// 抢票方法
         /// </summary>
         public abstract void DoForceTick();
     }
 }

抢票工具类

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace Wolfy.代理模式
 {
     public class TicketTool : BaseWork
     {
         MySelf myself;
         public override void DoForceTick()
         {
             if (myself == null)
             {
                 myself = new MySelf();
             }
             myself.DoForceTick();
         }
     }
 }

自己

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace Wolfy.代理模式
 {
     public class MySelf:BaseWork
     {
         public override void DoForceTick()
         {
             Console.WriteLine("抢一张北京西-郑州的火车票");
         }
     }
 }

控制台

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace Wolfy.代理模式
 {
     class Program
     {
         static void Main(string[] args)
         {
             //自己抢票
             MySelf myself = new MySelf();
             myself.DoForceTick();
             //抢票工具
             TicketTool tool = new TicketTool();
             tool.DoForceTick();
             Console.Read();
         }
     }
 }

结果

总结

代理模式优点:

(1).职责清晰

真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。

(3).高扩展性

代理模式的分类:远程(Remote)代理,虚拟(Virtual)代理,Copy-on-Write代理,智能引用(Smart Reference)代理。

各代理的具体说明,请参考:http://www.cnblogs.com/rush/archive/2011/06/19/2084775.html

如若对该模式的理解有误,请留言,讨论一下,共同学习=进步,谢谢

参考书:

Head First 设计模式