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

          其实,代理模式在生活中的应用很多,典型的例如明星的经纪人,外界与明星的联系都由经纪人来负责,什么电话该接进来,什么活动该拒绝都交给经纪人,这样在最大程度上保护了明星的隐私。这种模式也符合单一职责约束,明星只用做好自己的事情,其他的琐事经纪人会搞定的。

    1. 案例场景

          下面,我们就来用代码模拟一下明星和经济人的场景,从而了解代理模式的具体用法。

          作为利益共同体,经纪人和明星需要具有共同的行为,只不过真正做事的是明星,经纪人负责传话,因此他们需要一个共同Activiey接口:

    public interface Activity {
      public void interview();
      public void arietyShow();
    }

          明星类:

    public class Star implements Activity{
    
      @Override
      public void interview() {
        System.out.println("明星接受采访。。。");
      }
    
      @Override
      public void arietyShow() {
        System.out.println("明星参加综艺节目。。。");
      }
    }

          经纪人类:

    public class Agent implements Activity{
      Star star;
      public Agent(Star star){
        this.star = star;
      }
    
      @Override
      public void interview() {
        this.star.interview();
      }
    
      @Override
      public void arietyShow() {
        this.star.arietyShow();
      }
    }

          接下来就可以模拟一下明星-经纪人这种代理场景的运作了:

    public class ProxyTest {
      public static void main(String[] args) {
        Agent agent = new Agent(new Star());
        agent.arietyShow();
        agent.interview();
      }
    }

          输出为:

    明星参加综艺节目。。。
    明星接受采访。。。

    2. 概念定义

          上面简单介绍了代理模式的概念和具体场景的使用,那么,代理模式的正式定义是怎样的呢,Gof四人组给出的定义是:

    代理模式为对象提供一个替身,从而控制对这个对象的访问。

          外界的请求通过代理到达实际对象,实际对象的响应通过代理返回给外界。代理模式一个明显的优点是限制外界对对象的访问,从而起到保护对象的作用,缺点是增加了复杂性,而且由于需要代理做转换,增加了调用链的长度。

    3. UML结构

          将明显-经纪人的结构抽象出来,就可以得到代理模式的一般结构,如下:

    4. 结论

          当由于某种原因不能将对象直接暴露给外界时,或者需要限制对对象的访问时,就可以考虑使用代理模式。本文介绍的代理模式是基于代理对象和实际对象在同一个JVM堆上的情形,除此之外,代理模式还有以下几种:

    • 远程代理:控制对远程对象的访问
    • 虚拟代理:控制对创建开销较大的资源的访问
    • 保护代理:基于权限控制对资源的访问
    • 其他的类型就不一一列举了。。。

    5. 参考

    <<Head First设计模式>>

    <<大话设计模式>>

  • 相关阅读:
    Python学习9——异常
    提取微信小游戏代码
    linux 命令记录
    cpp 线程传递参数
    c++ primer 记录1
    你不知道的js
    js中的对象 函数 原型
    C++ 获取时间
    linux 常见命令
    git 的基本命令
  • 原文地址:https://www.cnblogs.com/NaLanZiYi-LinEr/p/11746272.html
Copyright © 2011-2022 走看看