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

发布时间 - 2025-12-25 00:00:00    点击率:
代理模式的核心是代理对象持有真实对象引用并提供相同接口,将调用转发给真实对象,同时在前后插入额外逻辑;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  # display  # private  # void 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Android滚轮选择时间控件使用详解  微信小程序 配置文件详细介绍  Laravel如何实现API资源集合?(Resource Collection教程)  如何在IIS管理器中快速创建并配置网站?  Android自定义控件实现温度旋转按钮效果  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel怎么为数据库表字段添加索引以优化查询  想要更高端的建设网站,这些原则一定要坚持!  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Python图片处理进阶教程_Pillow滤镜与图像增强  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  PHP 500报错的快速解决方法  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  免费视频制作网站,更新又快又好的免费电影网站?  Python并发异常传播_错误处理解析【教程】  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Bootstrap CSS布局之列表  如何续费美橙建站之星域名及服务?  昵图网官方站入口 昵图网素材图库官网入口  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  bootstrap日历插件datetimepicker使用方法  微信小程序 canvas开发实例及注意事项  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  如何确保FTP站点访问权限与数据传输安全?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  jQuery中的100个技巧汇总  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Laravel如何使用withoutEvents方法临时禁用模型事件  使用C语言编写圣诞表白程序  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Swift中switch语句区间和元组模式匹配  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Android okhttputils现在进度显示实例代码  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Windows Hello人脸识别突然无法使用  制作电商网页,电商供应链怎么做?  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  C#如何调用原生C++ COM对象详解  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何用PHP工具快速搭建高效网站?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  米侠浏览器网页图片不显示怎么办 米侠图片加载修复