全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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  # 延迟加载  # 封装  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # 对象  # 加载  # 转发给  # 的是  # 重写  # 先用  # 访问控制  # 客户端  # 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小时内与您取得联系。