设计模式-代理模式

定义

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

馒头杂谈

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

基本简介 

(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)小结:

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

原文地址:https://www.cnblogs.com/mongo/p/4615125.html