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布局之列表

