目录
意图
- 为另一个对象提供代理或占位符以控制对其的访问。
- 使用额外的间接级别来支持分布式、受控或智能访问。
- 添加包装器和委托以保护真实组件免受过度复杂性的影响。
问题
您需要支持资源匮乏的对象,并且您不希望实例化此类对象,除非并且直到客户端实际请求它们。
讨论
设计一个代理或代理对象:在客户端第一次请求代理时实例化真实对象,记住这个真实对象的身份,并将发起请求转发给这个真实对象。然后所有后续请求都简单地直接转发到封装的真实对象。
代理模式适用的常见情况有四种。
- 虚拟代理是“创建昂贵”对象的占位符。真实对象仅在客户端首次请求/访问对象时创建。
- 远程代理为驻留在不同地址空间中的对象提供本地代表。这就是 RPC 和 CORBA 中的“存根”代码所提供的。
- 保护代理控制对敏感主对象的访问。“代理”对象在转发请求之前检查调用者是否具有所需的访问权限。
- 访问对象时,智能代理会插入其他操作。典型用途包括:
- 计算对真实对象的引用次数,以便在没有更多引用时自动释放它(又名智能指针),
- 首次引用持久对象时将其加载到内存中,
- 在访问之前检查真实对象是否已锁定,以确保没有其他对象可以更改它。
结构
通过定义一个 Subject 接口,代理对象代替 RealSubject 的存在对客户端是透明的。

例子
代理提供代理或占位符以提供对对象的访问。支票或银行汇票是帐户中资金的代理。可以使用支票代替现金进行购买,并最终控制对发行人账户中现金的访问。

检查清单
- 确定最适合作为包装或代理实现的杠杆或“方面”。
- 定义一个接口,使代理和原始组件可互换。
- 考虑定义一个可以封装决定是否需要代理或原始对象的工厂。
- 包装类持有指向真实类的指针并实现接口。
- 指针可以在构造时初始化,也可以在首次使用时初始化。
- 每个包装器方法都贡献其杠杆作用,并委托给被包装对象。
经验法则
- 适配器为其主题提供了不同的接口。代理提供相同的接口。装饰器提供了一个增强的接口。
- Decorator 和 Proxy 的用途不同,但结构相似。两者都描述了如何提供对另一个对象的间接级别,并且实现保留对它们转发请求的对象的引用。
本文来自转载,原文链接: