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


相关推荐: JavaScript如何实现类型判断_typeof和instanceof有什么区别  php json中文编码为null的解决办法  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  音响网站制作视频教程,隆霸音响官方网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  专业商城网站制作公司有哪些,pi商城官网是哪个?  java中使用zxing批量生成二维码立牌  如何快速搭建高效WAP手机网站吸引移动用户?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  微信小程序 canvas开发实例及注意事项  iOS UIView常见属性方法小结  高端网站建设与定制开发一站式解决方案 中企动力  移动端脚本框架Hammer.js  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel怎么在Blade中安全地输出原始HTML内容  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  高防服务器租用如何选择配置与防御等级?  JavaScript如何实现继承_有哪些常用方法  Laravel如何与Pusher实现实时通信?(WebSocket示例)  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何在云主机上快速搭建多站点网站?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  南京网站制作费用,南京远驱官方网站?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  高性价比服务器租赁——企业级配置与24小时运维服务  如何确认建站备案号应放置的具体位置?  如何快速查询域名建站关键信息?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何在宝塔面板中修改默认建站目录?  如何在阿里云服务器自主搭建网站?  JavaScript Ajax实现异步通信  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  JS经典正则表达式笔试题汇总  Laravel怎么使用Intervention Image库处理图片上传和缩放  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel怎么上传文件_Laravel图片上传及存储配置  JS碰撞运动实现方法详解  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Bootstrap CSS布局之列表