🛡️
一句话理解:代理与真实对象实现同一接口,并在访问真实对象前后加入控制,例如延迟加载、缓存、权限检查或远程通信。

模式结构

  • Subject:客户端依赖的共同接口
  • Real Subject:真正完成工作的对象
  • Proxy:持有或定位真实对象,并控制访问
代理的重点不是新增业务能力,而是管理“何时、是否以及怎样访问”真实对象。

C# 示例:缓存代理

调用方始终依赖 IProfileSource,无需知道数据来自网络还是缓存。实际项目还应处理超时、取消、并发请求合并和缓存过期。

常见代理

  • 虚拟代理:昂贵资源首次使用时才加载
  • 远程代理:封装网络调用与序列化
  • 保护代理:访问前检查权限
  • 缓存代理:复用结果并控制失效
  • 智能引用:统计引用、日志或生命周期

Unity 场景

Addressables 资源句柄包装、远程配置、本地/云存档网关、受权限控制的调试功能,都可以使用代理。若代理持有资源句柄,必须明确释放责任。

与装饰器的区别

代理和装饰器都使用相同接口包装对象。装饰器强调叠加功能且常允许多层组合;代理强调代表真实对象并控制访问,通常有明确的访问策略。

风险

缓存失效、异常传播和资源释放比包装结构本身更重要。隐藏网络或磁盘延迟也可能误导调用方,因此异步接口应保持显式。

小结

代理让调用方看到稳定接口,同时把访问策略集中管理。设计时要把缓存生命周期、错误语义和资源所有权写清楚。