C++如何实现一个代理(Proxy)设计模式?(代码示例)


代理模式的核心是代理对象持有真实对象引用并提供相同接口,将调用转发给真实对象,同时在前后插入额外逻辑;C++中通过抽象基类定义纯虚接口,由RealImage和ProxyImage共同继承,ProxyImage延迟加载RealImage以实现虚拟代理。

代理模式的核心是让代理对象持有真实对象的引用,对外提供相同接口,把调用转发给真实对象,同时在前后可插入额外逻辑(如权限检查、日志、延迟加载等)。C++中常用抽象基类定义接口,由真实类和代理类共同继承。

定义统一接口

先用纯虚函数声明操作契约,确保代理与真实对象行为一致:

class Image {
public:
    virtual ~Image() = default;
    virtual void display() const = 0;
};

实现真实对象

真实类负责核心功能,比如加载并显示图片:

class RealImage : public Image {
private:
    std::string filename;

public: explicit RealImage(const std::string& f) : filename(f) { std::cout << "Loading image: " << filename << "\n"; // 模拟耗时加载 std::this_thread::sleep_for(std::chrono::milliseconds(500)); }

void display() const override {
    std::cout << "Displaying image: " << filename << "\n";
}

};

实现代理类

代理持有一个真实对象指针(延迟初始化或直接持有),重写接口方法,在调用前后加入控制逻辑:

class ProxyImage : public Image {
private:
    std::string filename;
    mutable RealImage* real_image; // mutable 允许在 const 成员函数中修改

public: explicit ProxyImage(const std::string& f) : filename(f), real_image(nullptr) {}

~ProxyImage() {
    delete real_image;
}

void display() const override {
    if (!real_image) {
        real_image = new RealImage(filename);
    }
    real_image->display();
}

};

使用方式

客户端只依赖 Image 接口,无需感知是代理还是真实对象:

int main() {
    Image* image1 = new ProxyImage("photo.jpg");
    Image* image2 = new ProxyImage("report.pdf");
image1->display(); // 触发加载 + 显示
image1->display(); // 直接显示(已加载)
image2->display(); // 触发加载 + 显示

delete image1;
delete image2;
return 0;

}

这个例子展示的是“虚拟代理”(lazy initialization),其他常见变体如保护代理(加访问控制)、远程代理(封装网络调用)、智能引用代理(自动计数/释放)等,都遵循同一结构:接口统一、代理持有真实对象、转发+增强。


# ai  # c++  # proxy  # pdf  # 延迟加载  # 封装  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # 对象  # 加载  # 转发给  # 的是  # 重写  # 先用  # 访问控制  # 客户端  # const  # private  # display 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何在 Go 中正确反序列化多个同级 XML 元素(而非单个根节点)  Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度  php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】  windows 10专注助手怎么关闭_windows 10禁用通知提醒功能方法  Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】  c++怎么设置线程优先级与cpu亲和性_c++ 多核处理器性能绑定【指南】  如何用正则与预处理高效拦截带干扰符的恶意域名  Win11如何设置鼠标灵敏度_Win11鼠标灵敏度调整教程【攻略】  如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践  Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式  PHP cURL GET请求:正确设置请求头与身份认证的完整教程  Win11时间不对怎么同步_Win11自动校准互联网时间【设置】  c++ namespace命名空间用法_c++避免命名冲突  如何理解Go指针和内存分配关系_Go Pointer内存Model解析  c++怎么处理多线程死锁_c++ lock_guard与unique_lock锁管理【技巧】  Win11系统占用空间大怎么办 Win11深度瘦身清理指南【优化】  Python脚本参数接收_sys与argparse解析【指导】  VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】  Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理  Python生成器表达式内存优化_惰性计算说明【指导】  php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】  Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据  Win11开机速度慢怎么优化_Win11系统启动加速设置指南【方法】  Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  Mac怎么进行语音输入_Mac听写功能设置与使用【教程】  如何使用Golang template生成文本模板_动态生成HTML或文本  如何使用Golang实现Web表单数据绑定_自动映射字段到结构体  c# 在高并发下使用反射发射(Reflection.Emit)的性能  如何在Golang中使用replace替换模块_指定本地或远程路径  Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】  如何在Golang中操作嵌套切片指针_Golang多维slice修改  Go 中的 := 运算符:类型推导机制与使用边界详解  Windows电脑如何进入安全模式?(多种按键方法)  windows 10应用商店区域怎么改_windows 10微软商店切换地区方法  Go 中实现 Python urllib.quote() 等效功能的正确方式  如何使用Golang实现容器健康检查_监控和自动重启  Windows10系统怎么查看运行时间_Win10 CPU正常运行时间查询  使用类变量定义字符串常量时如何实现类型安全的 Literal 注解  c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】  Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】  Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置  微信短链接怎么还原php_用浏览器开发者工具抓包获取【方法】  如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)  Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  英国搜索:多数英国人认为语言搜索是未来搜索  c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】  如何诊断并终止卡死的 multiprocessing 子进程  c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】 

 2025-12-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.