1. 人人编程首页
  2. 架构设计

代理设计模式

意图

  • 为另一个对象提供代理或占位符以控制对其的访问。
  • 使用额外的间接级别来支持分布式、受控或智能访问。
  • 添加包装器和委托以保护真实组件免受过度复杂性的影响。

问题

您需要支持资源匮乏的对象,并且您不希望实例化此类对象,除非并且直到客户端实际请求它们。

讨论

设计一个代理或代理对象:在客户端第一次请求代理时实例化真实对象,记住这个真实对象的身份,并将发起请求转发给这个真实对象。然后所有后续请求都简单地直接转发到封装的真实对象。

代理模式适用的常见情况有四种。

  1. 虚拟代理是“创建昂贵”对象的占位符。真实对象仅在客户端首次请求/访问对象时创建。
  2. 远程代理为驻留在不同地址空间中的对象提供本地代表。这就是 RPC 和 CORBA 中的“存根”代码所提供的。
  3. 保护代理控制对敏感主对象的访问。“代理”对象在转发请求之前检查调用者是否具有所需的访问权限。
  4. 访问对象时,智能代理会插入其他操作。典型用途包括:
    • 计算对真实对象的引用次数,以便在没有更多引用时自动释放它(又名智能指针),
    • 首次引用持久对象时将其加载到内存中,
    • 在访问之前检查真实对象是否已锁定,以确保没有其他对象可以更改它。

结构

通过定义一个 Subject 接口,代理对象代替 RealSubject 的存在对客户端是透明的。

代理设计模式

例子

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

代理设计模式

检查清单

  1. 确定最适合作为包装或代理实现的杠杆或“方面”。
  2. 定义一个接口,使代理和原始组件可互换。
  3. 考虑定义一个可以封装决定是否需要代理或原始对象的工厂。
  4. 包装类持有指向真实类的指针并实现接口。
  5. 指针可以在构造时初始化,也可以在首次使用时初始化。
  6. 每个包装器方法都贡献其杠杆作用,并委托给被包装对象。

经验法则

  • 适配器为其主题提供了不同的接口。代理提供相同的接口。装饰器提供了一个增强的接口。
  • Decorator 和 Proxy 的用途不同,但结构相似。两者都描述了如何提供对另一个对象的间接级别,并且实现保留对它们转发请求的对象的引用。

本文来自转载,原文链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注