2.8 代理模式
代理模式(Proxy)用一个替身对象站在真实对象前面,控制对它的访问。代理和真实对象实现同一个接口,所以客户端以为自己在直接用真实对象,实际上每次请求都先经过代理。
代理能在“转发请求”前后插入各种控制逻辑,由此衍生出几种常见类型:
- 虚拟代理:推迟昂贵对象的创建(懒加载)。
- 保护代理:在转发前做权限检查。
- 远程代理:把本地调用转成网络请求(RPC 桩)。
- 智能引用:在访问时附带计数、加锁、日志等。
下面的懒加载实验:真实的高清图片很重,代理先显示占位符,直到你第一次真正 render() 才创建并加载它,之后缓存复用。
正在加载交互实验...
保护代理:在门口检查
java
class GuardProxy implements Service {
private final Service real;
private final User user;
public void delete() {
if (!user.isAdmin()) throw new AccessDeniedException(); // 先检查
real.delete(); // 再转发
}
}真实对象 real 完全不必关心“谁在调用”,鉴权被干净地隔离在代理里。下面的访问控制实验让你切换角色(游客 / 用户 / 管理员)并尝试操作,观察代理放行还是拦截。
正在加载交互实验...
正在加载概念检查...
代理 vs 装饰器 vs 适配器
这三者结构相似(都包裹一个对象),区别全在意图:
| 模式 | 意图 | 接口 |
|---|---|---|
| 适配器 | 转换接口,让不兼容的能协作 | 改变接口 |
| 装饰器 | 增强功能,叠加职责 | 保持接口 |
| 代理 | 控制访问,不增强功能 | 保持接口 |
一句话区分:装饰器让对象做更多,代理决定对象能不能被用。
正在加载概念检查...
正在加载本节练习...