29

代理模式

 4 years ago
source link: https://www.tuicool.com/articles/qeYviey
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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结构

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

N7zEnym.png!web

4. 结论

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

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

5. 参考

<<Head First设计模式>>

<<大话设计模式>>


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK