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

    定义

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

    馒头杂谈

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

    基本简介 

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

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

  • 相关阅读:
    Json对象与Json字符串互转(4种转换方式)
    Web.config配置文件详解
    jQuery BlockUI Plugin Demo 6(Options)
    jQuery BlockUI Plugin Demo 5(Simple Modal Dialog Example)
    jQuery BlockUI Plugin Demo 4(Element Blocking Examples)
    jQuery BlockUI Plugin Demo 3(Page Blocking Examples)
    jQuery BlockUI Plugin Demo 2
    <configSections> 位置引起的错误
    关于jQuery的cookies插件2.2.0版设置过期时间的说明
    jQuery插件—获取URL参数
  • 原文地址:https://www.cnblogs.com/mongo/p/4615125.html
Copyright © 2011-2022 走看看