如何运用结构型设计模式实现基础代理模式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1257个文字,预计阅读时间需要6分钟。
直接复制真实对象会导致代理破坏代理语法——你的代理是那个对象,而不是它的副本。当真实对象有状态或资源(如文件句柄、网络连接)时,赋值操作会导致状态或资源丢失。这时,值传递会导致行为错误或资源重复释放。
实操建议:
- 用
std::unique_ptr<RealSubject>或RealSubject*持有(推荐前者,明确所有权) - 若需共享生命周期,用
std::shared_ptr<RealSubject>,但要警惕循环引用 - 避免裸指针 + 手动
new/delete—— 容易漏删、重复删,引发double free或悬空指针 - 构造代理时传入已存在的真实对象实例,不要在代理内部自行构造(除非是虚拟代理场景)
虚函数表和继承关系决定能否拦截调用
代理模式依赖多态:用户通过基类接口操作代理,代理再转发给真实对象。如果 RealSubject 没有从公共抽象基类(比如 Subject)继承,或关键方法没声明为 virtual,代理就无法统一接口,也就谈不上“透明代理”。
本文共计1257个文字,预计阅读时间需要6分钟。
直接复制真实对象会导致代理破坏代理语法——你的代理是那个对象,而不是它的副本。当真实对象有状态或资源(如文件句柄、网络连接)时,赋值操作会导致状态或资源丢失。这时,值传递会导致行为错误或资源重复释放。
实操建议:
- 用
std::unique_ptr<RealSubject>或RealSubject*持有(推荐前者,明确所有权) - 若需共享生命周期,用
std::shared_ptr<RealSubject>,但要警惕循环引用 - 避免裸指针 + 手动
new/delete—— 容易漏删、重复删,引发double free或悬空指针 - 构造代理时传入已存在的真实对象实例,不要在代理内部自行构造(除非是虚拟代理场景)
虚函数表和继承关系决定能否拦截调用
代理模式依赖多态:用户通过基类接口操作代理,代理再转发给真实对象。如果 RealSubject 没有从公共抽象基类(比如 Subject)继承,或关键方法没声明为 virtual,代理就无法统一接口,也就谈不上“透明代理”。

