今天,我们来说说代理模式,所谓代理,就是代理啦(哈哈),现实世界里,我们常常会听过什么拿下某某代理,今天我们要讲的也是这种代理,在程序的世界里,我们可以称之为封装(也就是包一层),好,废话不多说,直接撸代码。。
/// <summary> /// 业务接口 /// </summary> public interface ISubject { /// <summary> /// get /// </summary> /// <returns></returns> bool GetSomething(); /// <summary> /// DO /// </summary> void DoSomething(); }
还是原来的故事,先定义一个抽象业务接口,两个方法,一个返回bool类型,一个不返回,这么简单就无需再废话了。。。接下来,按照剧本的走向下一步就是去实现,好,我们再接着撸下一个。。
public class RealSubject : ISubject { public RealSubject() { Thread.Sleep(2000); long lResult = 0; for (int i = 0; i < 10000000; i++) { lResult += i; } Console.WriteLine("RealSubject被构造。。。。"); } public void DoSomething() { Console.WriteLine("开始排队了。。。"); Thread.Sleep(2000); Console.WriteLine("终于买到票了。。。"); } public bool GetSomething() { Console.WriteLine("坐车去火车站看看余票信息。。。"); Thread.Sleep(3000); Console.WriteLine("到火车站,看到是有票的"); return true; } }
RealSubject类,我们实现了Isubject接口,这里我们模拟的是买票情景,我们看RealSubject类的构造函数,这里我们是模拟去火车站购票难的感受,想想以前没有网络购票的年代,要买一张火车票是多么的艰难啊(咳咳,虽然我也没体验过,哈哈),反正就是这么个意思,让这个对象创建变得异常的长,然后我们实现了接口的两个方法,模拟排队买票和去火车站查票的动作。这个就是我们今天的被代理人了,接下来,按部就班的我们就应该创建一个代理人了,撸起袖子代码码起来。。。
public class ProxySubject : ISubject { private ISubject _iSubject = null;// new RealSubject(); private static bool _BooleanResult = false; private static bool _IsInit = false; private void Init() { this._iSubject = new RealSubject(); } private void Structure() { if (this._iSubject == null) { this.Init(); } } /// <summary> /// 买票 /// </summary> public void DoSomething() { Console.WriteLine("开始为您购票,请稍后!"); if (this.GetSomething()) this._iSubject.DoSomething(); } /// <summary> /// 火车站查询火车票 /// </summary> /// <returns></returns> public bool GetSomething() { Console.WriteLine("正在为您查询余票,请稍后"); this.Structure(); if (!_IsInit) { _BooleanResult = this._iSubject.GetSomething(); _IsInit = true; } Console.WriteLine("已为您查询到有票哦!"); return _BooleanResult; } }
ProxySubject类同样继承Isubject接口,被代理人和代理人核心业务是相同的咯,但是代理人嘛,当然也会包装自己,让自己的业务被更多人去使用撒。。好,我们看代码,我们首先看Init方法,这里就是创建一个被代理人,这里就是拿下代理的意思(哈哈),然后是Structure方法,这里就是判断有没有拿下代理,拿下了就不要重复拿了嘛,毕竟拿人家的代理是要收费的嘛,不能傻到送钱给人家撒。。额,其实是因为我们上面模拟了创建RealSubject类是需要N多资源的,或者是需要太多的IO操作(其实这里就是单例模式的效果),
然后,他同样实现接口的两个方法,因为这是业务的核心,也就是说,以后如果你想买票,直接就找他,然后由他去帮你去火车站购票查票。。好了,代理模式的骨架说完了,最后,我们看看调用
static void Main(string[] args) { try { Console.WriteLine("*************Proxy1************"); ISubject subject = new ProxySubject(); subject.GetSomething(); subject.DoSomething(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); }
首先,我们new一个ProxySubject对象,这里注意,我们new的时候是还没有去创建RealSubject对象的,只有在使用DoSomething方法和GetSomething方法时才会真正的去创建RealSubject对象,来,让我们把代码跑起来看看效果。。
这里红线圈起来的是被代理的逻辑,其他是我们代理的逻辑。所以说,代理模式其实就是我们所谓的包一层,它的主要业务逻辑是不可改变的,但是在代理中,我们可以把多个业务组合再一起形成新的业务,但是最终影响的结果肯定是一致的。。。
好了,今天的代理模式就学完了。。。还不懂的同学多撸几遍代码就OK了。。。