• C#设计模式——代理模式


    1.代理模式介绍

      在软件开发中有时会遇到不能直接使用对象的问题,如我们要使用的对象在进程外,甚至在远程的机器上,但是我们要使用这个对象的功能怎么办呢?代理模式就可以用来解决这个问题。举一个生活中的例子:一个害羞男孩追求一个叫如花的女孩,但是自己不敢送礼物,就找了一个朋友代理他给如花送礼物。就以这个例子介绍代理模式的角色:

      抽象主题角色:定义了真实主题和代理主题的公共接口,害羞男孩和他的朋友都有给如花送礼物的功能

      代理主题角色:害羞男孩的朋友,我们代码中直接使用的对象,通过代理对象我们可以调用真实对象的功能

      真实主题角色:害羞男孩,我们真正要使用的对象

    代理模式也经常用于对对象的访问做一些控制,如男孩的朋友比较热心,送礼物前会先判断如花是不是个好人,如果如花不是个好人他就不替害羞男孩送礼物给如花了。

    代码实现

    复制代码
    复制代码
        /// <summary>
        /// 送礼物的人 (抽象主题角色)
        /// </summary>
        public abstract class GiveGiftPerson
        {
            //送礼物功能
            public abstract void GiveGift();
        }
    
       /// <summary>
        /// 害羞男孩  (真实主题角色)
        /// </summary>
        public class ShyBoy : GiveGiftPerson
        {
            public override void GiveGift()
            {
                Console.WriteLine("害羞男孩送礼物给如花~~");
            }
        }
    
        /// <summary>
        /// 害羞男孩的朋友(代理主题角色)
        /// </summary>
        public class Friend : GiveGiftPerson
        {
            //引用真实主题实例
            ShyBoy shyboy = new ShyBoy();
            public override void GiveGift()
            {
                //朋友一顿分析后,觉得如花是个好人
                bool IsRuhuaGood = true;
                if (IsRuhuaGood)
                {
                    //调用真实主题的方法
                    shyboy.GiveGift();
                }
            }
        }
    复制代码
    复制代码

    客户端调用:

    复制代码
    复制代码
        class Program
        {
            static void Main(string[] args)
            {
                //因为不能直接访问到真实对象所以我们不能直接new ShyBoy()去送礼物。
                
                //代码中使用的是代理对象
                Friend friend = new Friend();
                friend.GiveGift();
                Console.ReadKey();
            }
        }
    复制代码
    复制代码

    程序运行如下:


    2.小结

    上边例子的类图

    代理模式的使用场景:

      当我们不能直接访问所需类,或者我们想对类的访问做一些控制时使用。WCF是代理模式的典型应用。

     代理模式的优点:

      职责清晰,扩展性好,很方便对类的访问进行控制

    代理模式的缺点:

      在客户端和真实主题间加了代理对象,可能造成处理请求的速度变慢。

  • 相关阅读:
    pip相关工具使用小结
    PyCharm配置autopep8,自动格式化Python代码
    PyCharm运行Nosetests并导出测试报告
    Jenkins集成taffy进行自动化测试并输出测试报告
    Locust性能测试框架,从入门到精通
    浅谈如何打造一个安全稳定高效的容器云平台
    微服务治理平台的RPC方案实现
    这个需求我不接之事务的自动补偿
    微服务熔断隔离机制及注意事项
    容器化-Docker介绍
  • 原文地址:https://www.cnblogs.com/yuyangbk/p/13958411.html
Copyright © 2020-2023  润新知