设计模式学习 之 代理模式

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

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

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

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

代理模式 常见的应用

            一。远程代理。也就是一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在不同的空间的事实,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 )可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。然而,当   我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

原文地址:https://www.cnblogs.com/lfyy/p/5115323.html