interface

Proxy

1. 介绍演示

代理模式(Proxy) 为其他对象提供一种代理以控制对这个对象的访问.
**
代理模式很像适配器 Adaptor 模式, 适配器是把 A 接口转换为 B 接口:

  1. public BAdapter implements B {
  2. private A a;
  3. public BAdapter(A a) {
  4. this.a = a;
  5. }
  6. public void b() {
  7. a.a();
  8. }
  9. }

而 Proxy 模式不是把 A 接口转换成 B 接口,它还是转换成 A 接口:

public AProxy implements A {
    private A a;
    public AProxy(A a) {
        this.a = a;
    }
    public void a() {
        if (getCurrentUser().isRoot()) {
            this.a.a();
        } else {
               throw new SecurityException("Forbidden");
        }
    }
}

代理的好处就是控制对这个对象的访问, 比如, 我们写好了 A a.a() 这样的方法, 但是如果我们有这样的要求: 只想让权限用户调用, 否则就抛出异常. 就可以在以下方法的上下加上其他代码, 大做文章, 从而实现我们的要求.

为什么不把权限检查的功能直接写到目标实例 A 的内部? 因为我们编写代码的原则有:

  • 职责清晰: 一个类只负责一件事;
  • 易于测试: 一次只测一个功能.

2. 逻辑步骤

用 Proxy 实现这个权限检查, 我们可以获得更清晰, 更简洁的代码:

  • A接口: 只定义接口;
  • ABusiness类: 只实现A接口的业务逻辑;
  • APermissionProxy类: 只实现A接口的权限检查代理.

如果我们希望编写其他类型的代理, 可以继续增加类似 ALogProxy, 而不必对现有的 A 接口, ABusiness类进行修改.

3. 广泛应用

实际上权限检查只是代理模式的一种应用, Proxy还广泛应用在:

  • 远程代理
  • 虚代理
  • 保护代理
  • 智能引用