实现一个代理模式 (Proxy)

· 约 3 分钟读完 · 第 124 / 125 章

推荐答案

本题详细解读

1. 代理模式的定义

代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用,从而可以在不改变目标对象的情况下增加额外的功能。

2. 代码结构

  • RealSubject: 这是目标对象,它定义了代理对象所代表的真实对象。在这个例子中,RealSubject 类有一个 request 方法,用于处理实际的请求。

  • Proxy: 这是代理对象,它持有一个对 RealSubject 的引用,并实现了与 RealSubject 相同的接口。代理对象可以在调用 RealSubject 的 request 方法之前或之后执行一些额外的操作,例如权限检查、日志记录等。

3. 代码执行流程

  1. 客户端代码创建一个 RealSubject 实例。
  2. 客户端代码创建一个 Proxy 实例,并将 RealSubject 实例传递给代理。
  3. 客户端代码调用代理的 request 方法。
  4. 代理对象首先调用 checkAccess 方法检查权限。
  5. 如果权限检查通过,代理对象调用 RealSubject 的 request 方法。
  6. 代理对象最后调用 logAccess 方法记录请求时间。

4. 适用场景

  • 延迟初始化(虚拟代理): 当你有一个重量级的对象,并且希望在真正需要时才创建它时,可以使用代理模式。
  • 访问控制(保护代理): 当你希望控制对某个对象的访问权限时,可以使用代理模式。
  • 日志记录(日志代理): 当你希望在访问对象时记录日志时,可以使用代理模式。
  • 缓存(缓存代理): 当你希望缓存某些操作的结果时,可以使用代理模式。

5. 优点

  • 职责清晰: 代理模式可以将与核心业务逻辑无关的功能(如权限检查、日志记录等)分离到代理对象中,使得代码更加清晰。
  • 扩展性强: 通过代理模式,你可以在不修改目标对象的情况下增加新的功能。

6. 缺点

  • 性能开销: 由于代理对象的存在,可能会增加额外的性能开销。
  • 复杂性增加: 代理模式可能会增加代码的复杂性,特别是在代理对象和目标对象之间的交互较为复杂时。