Skip to content

Latest commit

 

History

History
88 lines (58 loc) · 2.31 KB

proxy.md

File metadata and controls

88 lines (58 loc) · 2.31 KB

代理模式

1. 模式作用

代理模式在我们的日常生活中是很长常见的,例如房产中介,当我们需要租房的时候,我们可能会不直接去联系房东,而是通过中介的帮助完成租房,这样做有什么好处呢?中介可以帮我们对自己需要的房子进行筛选,包括地区,配套,价格等等。这就很大的提高了我们的租房效率。在软件开发的过程中,同样很多的情况下我们会使用到代理模式。

2. 代码试例

代理类和被代理类共同实现的接口

public interface WizardTower {

  void enter(Wizard wizard);
}

IvoryTower 是被代理的对象实现了 WizardTower 接口

public class IvoryTower implements WizardTower {

  private static final Logger LOGGER = LoggerFactory.getLogger(IvoryTower.class);

  public void enter(Wizard wizard) {
    LOGGER.info("{} enters the tower.", wizard);
  }

}

WizardTowerProxy 作为 IvoryTower 的代理类,他们共同实现了 WizardTower 接口的方法。在 WizardTowerProxy 的内部对被代理类 IvoryTower 进行了进一步的封装。

public class WizardTowerProxy implements WizardTower {

  private static final Logger LOGGER = LoggerFactory.getLogger(WizardTowerProxy.class);

  private static final int NUM_WIZARDS_ALLOWED = 3;

  private int numWizards;

  private final WizardTower tower;

  public WizardTowerProxy(WizardTower tower) {
    this.tower = tower;
  }

  @Override
  public void enter(Wizard wizard) {
    if (numWizards < NUM_WIZARDS_ALLOWED) {
      tower.enter(wizard);
      numWizards++;
    } else {
      LOGGER.info("{} is not allowed to enter!", wizard);
    }
  }
}

Wizard 是被代理对象的一个参数

public class Wizard {

  private final String name;

  public Wizard(String name) {
    this.name = name;
  }

  @Override
  public String toString() {
    return name;
  }

}

3. 模式优缺点

3.1 优点

代理模式在客户端和目标对象之间具有一定的保护作用,同时可以扩展目标对象的功能,将客户端和目标对象隔离,降低了系统的耦合度,增加了程序的可扩展性。

3.2 缺点

在使用代理模式的时候会增加类的数量,使得请求的速度变慢,同时会增加系统的复杂性。