interface
1. 介绍演示
代理模式(Proxy) 为其他对象提供一种代理以控制对这个对象的访问.
**
代理模式很像适配器 Adaptor 模式, 适配器是把 A 接口转换为 B 接口:
public BAdapter implements B {
private A a;
public BAdapter(A a) {
this.a = a;
}
public void b() {
a.a();
}
}
而 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还广泛应用在:
- 远程代理
- 虚代理
- 保护代理
- 智能引用
- …