设计模式----代理模式

        今天,我们来说说代理模式,所谓代理,就是代理啦(哈哈),现实世界里,我们常常会听过什么拿下某某代理,今天我们要讲的也是这种代理,在程序的世界里,我们可以称之为封装(也就是包一层),好,废话不多说,直接撸代码。。

/// <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了。。。

 

posted @ 2019-04-21 16:06  守望阳光01  阅读(390)  评论(0编辑  收藏  举报