代理模式的核心是代理对象持有真实对象引用并提供相同接口,将调用转发给真实对象,同时在前后插入额外逻辑;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 (!re
al_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
# 延迟加载
# 封装
# 指针
# 继承
# 虚函数
# 纯虚函数
# 接口
# 对象
# 加载
# 转发给
# 的是
# 重写
# 先用
# 访问控制
# 客户端
# virtual
# std
# display
相关文章:
,想在网上投简历,哪几个网站比较好?
C#如何在一个XML文件中查找并替换文本内容
c# 在高并发下使用反射发射(Reflection.Emit)的性能
网站设计制作企业有哪些,抖音官网主页怎么设置?
定制建站流程解析:需求评估与SEO优化功能开发指南
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
建站之星安装提示数据库无法连接如何解决?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
如何选择可靠的免备案建站服务器?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何基于PHP生成高效IDC网络公司建站源码?
网站制作公司排行榜,四大门户网站排名?
浅谈Javascript中的Label语句
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
javascript中对象的定义、使用以及对象和原型链操作小结
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
如何在云虚拟主机上快速搭建个人网站?
宝塔建站无法访问?如何排查配置与端口问题?
利用JavaScript实现拖拽改变元素大小
Python路径拼接规范_跨平台处理说明【指导】
如何快速查询网址的建站时间与历史轨迹?
建站之星如何助力网站排名飙升?揭秘高效技巧
如何快速上传建站程序避免常见错误?
C#怎么创建控制台应用 C# Console App项目创建方法
建站VPS选购需注意哪些关键参数?
c# 服务器GC和工作站GC的区别和设置
c++怎么用jemalloc c++替换默认内存分配器【性能】
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
如何用VPS主机快速搭建个人网站?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
,网站推广常用方法?
如何在服务器上三步完成建站并提升流量?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
代刷网站制作软件,别人代刷火车票靠谱吗?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何在Windows 2008云服务器安全搭建网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
开封网站制作公司,网络用语开封是什么意思?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
存储型VPS适合搭建中小型网站吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。