代理模式通过代理类控制对真实对象的访问,三者共享抽象接口以实现透明替换;典型应用为虚拟代理(延迟加载),首次调用时初始化真实对象;推荐用智能指针管理生命周期;还可扩展为保护代理(权限校验)和智能代理(访问追踪)。

代理模式在C++中通过定义一个与真实对象具有相同接口的代理类,由代理控制对真实对象的访问,在不改变客户端代码的前提下增加额外逻辑(如权限检查、延迟加载、日志记录等)。
核心结构:接口 + 真实类 + 代理类
三者需共享同一抽象接口,确保代理可透明替换真实对象:
- 定义纯虚接口(如 Image),声明所有对外公开的操作(如 display())
- 实现真实类(如 RealImage),负责实际功能(如从磁盘加载并显示图片)
- 实现代理类(如 ProxyImage),持有一个真实对象指针(通常延迟初始化),在调用前后插入控制逻辑
典型场景:虚拟代理(延迟加载)
适用于创建开销大、使用频率低的对象,例如大图加载。代理只在真正需要时才实例化真实对象:
- 代理构造时不加载资源,仅保存文件名等必要信息
- 首次调用 display() 时检查真实对象是否为空,为空则 new RealImage
- 后续调用直接委托给已创建的真实对象
关键细节:生命周期与所有权管理
代理中真实对象的内存管理需谨慎:
立即学习“C++免费学习笔记(深入)”;
- 推荐使用智能指针(如 std::unique_ptr
)自动管理,避免内存泄漏 - 若代理只是临时持有(如日志代理),可用裸指针或引用,但需确保真实对象生命周期长于代理
- 禁止在代理析构时无条件 delete 真实对象——除非明确拥有所有权
扩展:保护代理与智能代理
代理模式可灵活适配不同需求:
- 保护代理:在接口调用前加入权限校验(如检查用户角色),校验失败则抛异常或静默返回
- 智能代理:自动追踪访问次数、引用计数,或在对象被销毁后自动重置代理状态
- 多个代理可叠加(如先权限检查再日志记录),通过组合而非继承实现职责分离











