zoukankan      html  css  js  c++  java
  • 设计模式----代理模式

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

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

  • 相关阅读:
    ASP.NET通过更改Url进行页面传值
    ASP.NET通过更改Url进行页面传值
    Java实现 蓝桥杯 算法提高 八数码(BFS)
    Java实现 蓝桥杯 算法提高 八数码(BFS)
    Java实现 蓝桥杯 算法提高 八数码(BFS)
    数千台服务器,千万用户量:居然之家两年云原生改造历程
    云原生生态周报 Vol. 15 | K8s 安全审计报告发布
    初探云原生应用管理之:聊聊 Tekton 项目
    Knative 基本功能深入剖析:Knative Serving 之服务路由管理
    阿里云 CDN 业务基于边缘容器的云原生转型实践
  • 原文地址:https://www.cnblogs.com/liuhuimh/p/10745541.html
Copyright © 2011-2022 走看看