代理模式的核心是代理对象持有真实对象引用并提供相同接口,将调用转发给真实对象,同时在前后插入额外逻辑;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
# private
# display
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何在 Go 中正确反序列化多个同级 XML 元素(而非单个根节点)
Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度
php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】
windows 10专注助手怎么关闭_windows 10禁用通知提醒功能方法
Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】
c++怎么设置线程优先级与cpu亲和性_c++ 多核处理器性能绑定【指南】
如何用正则与预处理高效拦截带干扰符的恶意域名
Win11如何设置鼠标灵敏度_Win11鼠标灵敏度调整教程【攻略】
如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践
Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式
PHP cURL GET请求:正确设置请求头与身份认证的完整教程
Win11时间不对怎么同步_Win11自动校准互联网时间【设置】
c++ namespace命名空间用法_c++避免命名冲突
如何理解Go指针和内存分配关系_Go Pointer内存Model解析
c++怎么处理多线程死锁_c++ lock_guard与unique_lock锁管理【技巧】
Win11系统占用空间大怎么办 Win11深度瘦身清理指南【优化】
Python脚本参数接收_sys与argparse解析【指导】
VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】
Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理
Python生成器表达式内存优化_惰性计算说明【指导】
php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】
Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据
Win11开机速度慢怎么优化_Win11系统启动加速设置指南【方法】
Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
Mac怎么进行语音输入_Mac听写功能设置与使用【教程】
如何使用Golang template生成文本模板_动态生成HTML或文本
如何使用Golang实现Web表单数据绑定_自动映射字段到结构体
c# 在高并发下使用反射发射(Reflection.Emit)的性能
如何在Golang中使用replace替换模块_指定本地或远程路径
Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】
如何在Golang中操作嵌套切片指针_Golang多维slice修改
Go 中的 := 运算符:类型推导机制与使用边界详解
Windows电脑如何进入安全模式?(多种按键方法)
windows 10应用商店区域怎么改_windows 10微软商店切换地区方法
Go 中实现 Python urllib.quote() 等效功能的正确方式
如何使用Golang实现容器健康检查_监控和自动重启
Windows10系统怎么查看运行时间_Win10 CPU正常运行时间查询
使用类变量定义字符串常量时如何实现类型安全的 Literal 注解
c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】
Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】
Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置
微信短链接怎么还原php_用浏览器开发者工具抓包获取【方法】
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
英国搜索:多数英国人认为语言搜索是未来搜索
c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】
如何诊断并终止卡死的 multiprocessing 子进程
c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】
2025-12-25
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。