代理模式

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

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设计模式>>

<<大话设计模式>>

posted @ 2019-10-26 23:29  纳兰小依  阅读(280)  评论(0编辑  收藏  举报