• 设计模式学习 之 代理模式


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

    组成: 包括 抽象角色:通过接口或抽象类声明真实角色实现的业务方法

                    代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作

                    真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用

    代理模式 常见的应用

                一。远程代理。也就是一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在不同的空间的事实,net 中 Webservice 的应用 。客户端调用代理就可以进行远程访问

               二,虚拟代理:根据需要创建开销很大的对象,通过了他来存放实例化的对象。例如 网络加载图片,网速不好时会有看到 图片边框先出来边框 ,它来占位

               三,安全代理:用来控制真实对象的访问权限  。比如说 贴吧 不同的 等级 有不同的 权限

               四。智能指引:是指当调用真实的对象时,额外处理一些其他的事情

       代理模式的一个好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。

      也就是 我们(A) 与真正的 另一方(c) 之间 有一个 第三者(B) , 为了 一些 特性的(安全,协助,,等原因 ),我们会把自己对  C 的 操作 转为 B 代 实现 。这样 避免了 直接 与 C 的 联系 造成的  其他  (D ,E..) 的影响

     代理 模式 体现了 前面说的 开放关闭原则

    举一个 买东西 的例子 我想 炒股 ,由于 菜鸟不会, 就让 A 代 我去 操作。

    1.提取 公共行为 。封装成接口

    /// <summary>
        /// 定义了 真实对象 RealRole 和 代理 Proxy 的 所要进行的 “活动”方法, 即 抽象角色 
        /// </summary>
    
       public abstract class StockType
        {
    
           //买银行股票
           public abstract void BuyBankStock();
    
           //买国债股票
           public abstract void BuyCountryStock();
    
    
           // 买石油股票
    
    
           public abstract void BuyShiYouStock();
    
           // 买医药股票
           public abstract void BuyYiYaoStock();
    
        }
    View Code

    2.真正的买家(股票交易所的账户) 使用这些行为  说明 自己 想要 做哪些东西

          String Person = "";
          public RealBuy(String Person)
            
          {
          
             this.Person = Person;
          }
    
          public override void BuyBankStock()
          {
              Console.WriteLine(Person + "要买银行股");
          }
    
          public override void BuyCountryStock()
          {
              Console.WriteLine(Person + "要买国家股");
          }
    
    
          public override void BuyShiYouStock()
          {
              Console.WriteLine(Person + "要买石油股");
          }
    
    
          public override void BuyYiYaoStock()
          {
              Console.WriteLine(Person + "要买医药股");
          }
    View Code

    3, 代理 也 继承 这些 行为  它 从 客户端 获得 使用 对象后, 再 从 实例化真正的买家 

          String Person = "";
          public RealBuy(String Person)
            
          {
          
             this.Person = Person;
          }
    
          public override void BuyBankStock()
          {
              Console.WriteLine(Person + "要买银行股");
          }
    
          public override void BuyCountryStock()
          {
              Console.WriteLine(Person + "要买国家股");
          }
    
    
          public override void BuyShiYouStock()
          {
              Console.WriteLine(Person + "要买石油股");
          }
    
    
          public override void BuyYiYaoStock()
          {
              Console.WriteLine(Person + "要买医药股");
          }
    View Code

    4. 客户端 调用 代理  

          String Person = "";
          public RealBuy(String Person)
            
          {
          
             this.Person = Person;
          }
    
          public override void BuyBankStock()
          {
              Console.WriteLine(Person + "要买银行股");
          }
    
          public override void BuyCountryStock()
          {
              Console.WriteLine(Person + "要买国家股");
          }
    
    
          public override void BuyShiYouStock()
          {
              Console.WriteLine(Person + "要买石油股");
          }
    
    
          public override void BuyYiYaoStock()
          {
              Console.WriteLine(Person + "要买医药股");
          }
    View Code

    例子不是很准确 ,把真正的 买家 理解成 交易所,  我们 把自己的名字 想买的 股票类型 ——》 代理  代理 把 名字 给 交易所 (实例化出 一个 账户对象)

    然后 这个对象(指我们自己) 采取购买 这个实例化的方法,返回  真实对象(交易所)设定的用户账号的 方法

    代理模式和装饰模式的一些区别

       装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。

        换句话 说,用代理模式,代理类(proxy )可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。然而,当   我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

  • 相关阅读:
    获取样式方法
    滚动条--滚动文字
    关于一些英文博客内容
    Don't performan heavy tasks in the MoBu Real-time engine thread, even if it worked before
    Autodesk 2014 M&E Devday is coming
    所有学生和老师的福音,欧特克将在全球免费开放软件给学生老师使用
    Autodesk 年度 AU 大会将在拉斯维加斯举行
    今天折腾了下NodeJs的调试
    如何解决 XMLHttpRequest 跨域请求的问题
    欧特克收购 ShotGun 产品
  • 原文地址:https://www.cnblogs.com/lfyy/p/5115323.html
Copyright © 2020-2023  润新知