• 设计模式-代理模式


    定义

    为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    馒头杂谈

    首先代理的概念在生活中非常常见,例如我们平时购买商品,都是通过专卖店或者一些品牌店来购买,而不是直接去工厂。例如设计部来了一个美女同事,你让你之前的设计部好友帮你打探打探(后来他们在一起了),例如某一天不知不觉你的朋友在朋友圈开始了"代理"之路(面膜面膜~~@@##$#%$##$).这些和我们的代理模式都是很相似的。 
     

    基本简介 

    (1)抽象角色(Subject)

    抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。

    (2)真实角色(RealSubject)

    也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者。

    (3)代理角色(Proxy)

    也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

    UML图

     

     

    示例

     我们按照UML图来做一个简单的例子进行初步体验

     (1.1)抽象主题类Subject

        /// <summary>
        /// 抽象角色
        /// </summary>
        public abstract class Subject
        {
            //抽象方法
            public abstract void Request();
        }

     (1.2)真实主题类RealSubject

        /// <summary>
        /// 真实主题
        /// </summary>
        public class RealSubject : Subject
        {
            /// <summary>
            /// 重写父类的方法
            /// </summary>
            public override void Request()
            {
                Console.WriteLine("真实的主题");
            }
        }

     (1.3)代理Proxy

      在代理类中我们可以根据实际情况进行一些处理,下边的begin_Request()和end_Request()就是一个预留

        /// <summary>
        /// 代理类
        /// </summary>
        public class Proxy : Subject
        {
            //持有的主题的对象
            private RealSubject _subject = null;
    
            public override void Request()
            {
                //0.1请求开始
                this.begin_Request();
    
                //0.2处理
                if (_subject == null)
                    _subject = new RealSubject();
                _subject.Request();
    
                //0.3善后处理
                this.end_Request();
            }
    
            #region 加入我们自己的逻辑处理方法
    
            /// <summary>
            /// 开始请求 
            /// </summary>
            public void begin_Request()
            {
                Console.WriteLine("..begin request");
            }
    
            /// <summary>
            /// 结束请求
            /// </summary>
            public void end_Request()
            {
                Console.WriteLine("..end request");
            }
    
            #endregion
        }

      (1.4)客户端调用

         class Program
        {
            static void Main(string[] args)
            {
                //代理类
                Proxy proxy = new Proxy();
                proxy.Request();
    
                Console.ReadKey();
            }
        }

       (1.5)测试结果

         

      (1.6)小结:

       我们的测试例子已经结束,这种偏向于静态代理,大家能看到静态代理中一个真是角色必须对应一个代理角色,很纯粹,代理对象代理真实对象所要做的事情,可以添加一些辅助方法,但是这种情况大量使用,会导致对应多个代理产生多个代理角色,导致类的臃肿。所以出现了动态代理,我们会在后边的文章慢慢了解,谢谢大家。 

  • 相关阅读:
    Visual Studio 插件的开发
    EntityFramework 4.x 使用中遇到的问题 (2)
    F#学习笔记核心类型(二)
    F#学习笔记函数式编程(一)
    EntityFramework 4.x 使用中遇到的问题 (1)
    vue3项目一些小坑
    记一种拖拉拽编排流程的思路
    隐藏Jenkinsfile敏感信息
    Jenkins条件判断
    Jenkins 流水线语法自动部署
  • 原文地址:https://www.cnblogs.com/mongo/p/4615125.html
Copyright © 2020-2023  润新知