0

0

C++如何使用代理模式实现延迟加载

P粉602998670

P粉602998670

发布时间:2025-09-22 08:10:01

|

317人浏览过

|

来源于php中文网

原创

代理模式通过代理类延迟创建真实对象,节省资源。示例中ProxyImage在首次调用display时才初始化RealImage,实现懒加载,避免无用开销,适用于图像、文件等耗时场景。

c++如何使用代理模式实现延迟加载

在C++中,代理模式可以用来实现延迟加载(Lazy Loading),即在真正需要对象的时候才创建它。这种方式能节省资源,避免不必要的初始化开销。通过代理类控制对真实对象的访问,可以在第一次调用时才实例化目标对象。

代理模式与延迟加载的基本思路

代理模式的核心是用一个代理类来代替真实对象,对外提供相同的接口。代理类持有真实对象的指针,在首次需要执行操作时才创建真实对象,之后所有调用都转发给真实对象。

延迟加载的关键点:

  • 真实对象在首次使用前不被创建
  • 代理类负责判断是否已初始化真实对象
  • 所有方法调用通过代理转发到真实对象

代码实现示例

下面是一个简单的图像加载场景:图像数据较大,我们希望在用户真正请求显示时才加载。

立即学习C++免费学习笔记(深入)”;

讯飞智作-讯飞配音
讯飞智作-讯飞配音

讯飞智作是一款集AI配音、虚拟人视频生成、PPT生成视频、虚拟人定制等多功能的AI音视频生产平台。已广泛应用于媒体、教育、短视频等领域。

下载
#include 
#include 

// 公共接口
class Image {
public:
    virtual ~Image() = default;
    virtual void display() = 0;
};

// 真实对象:高开销的图像加载
class RealImage : public Image {
    std::string filename;

public:
    explicit RealImage(const std::string& file) : filename(file) {
        loadFromDisk();  // 模拟耗时操作
    }

    void loadFromDisk() {
        std::cout << "正在加载图片: " << filename << "\n";
    }

    void display() override {
        std::cout << "显示图片: " << filename << "\n";
    }
};

// 代理类:支持延迟加载
class ProxyImage : public Image {
    std::string filename;
    mutable std::unique_ptr realImage;  // 延迟初始化

public:
    explicit ProxyImage(const std::string& file) : filename(file), realImage(nullptr) {}

    void display() override {
        if (!realImage) {
            realImage = std::make_unique(filename);
        }
        realImage->display();
    }
};

使用方式与效果

客户端代码无需知道使用的是代理还是真实对象,接口完全一致。

int main() {
    ProxyImage image("photo.jpg");  // 此时并未加载图片

    // 其他逻辑...
    std::cout << "做一些其他事情\n";

    // 第一次调用display,触发加载
    image.display();  // 输出:正在加载图片 + 显示图片

    // 后续调用直接使用已创建的对象
    image.display();  // 只输出:显示图片

    return 0;
}

运行结果会显示“正在加载图片”只出现一次,说明延迟加载生效。

关键设计要点

实现延迟加载代理时需要注意几个细节:

  • 接口一致性:代理和真实类应继承同一基类,保证多态调用
  • 指针管理:使用智能指针(如 unique_ptr)自动管理生命周期
  • 可变成员:realImage 声明为 mutable,以便在 const 方法中也能初始化
  • 线程安全:多线程环境下需加锁防止重复创建(未在示例中体现)

基本上就这些。代理模式配合延迟加载,让资源密集型对象的初始化更加高效,特别适合图形、文件、网络等场景。实现不复杂但容易忽略初始化时机和资源管理。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

14

2025.11.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

471

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

107

2025.12.24

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

1

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号