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


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

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

  • 相关阅读:
    Linux 内核源码中likely()和unlikely()【转】
    详解likely和unlikely函数【转】
    [arm驱动]Linux内核开发之阻塞非阻塞IO----轮询操作【转】
    Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现【转】
    Linux下的hrtimer高精度定时器【转】
    Linux 高精度定时器hrtimer 使用示例【转】
    Linux 进程等待队列【转】
    【转】【Android】对话框 AlertDialog -- 不错不错
    【转】 CATransform3D 矩阵变换之立方体旋转实现细节
    【转】如何在IOS中使用3D UI
  • 原文地址:https://www.cnblogs.com/liuhuimh/p/10745541.html
Copyright © 2020-2023  润新知