news 2026/5/12 3:19:04

设计模式[12]——代理模式一分钟彻底说透

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式[12]——代理模式一分钟彻底说透

设计模式[12]——代理模式(Proxy)一分钟彻底说透(C++版·软件领域真实例子)

一句话定义

为另一个对象提供一个占位符或代理,以控制对真实对象的访问,在需要时才创建、加载或执行真实操作。

最狠的比喻(软件人专属)

懒加载大图片:

  • UI上显示一个缩略图(代理)
  • 用户点击放大时,才真正从磁盘/网络加载高清原图(真实对象)
    客户端全程都以为自己在操作“图片”,完全不知道中间有代理在偷懒。
为什么需要它?(坏味道瞬间爆炸)

不用代理,你会这样写:

ImagerealImage("huge_photo_100MB.raw");// 程序启动就加载,慢到吐!realImage.display();// 就算只看缩略图,也等半天
和之前模式彻底分清(10秒表)
项目装饰器(Decorator)享元(Flyweight)外观(Facade)代理(Proxy)
核心意图动态叠加行为共享内在状态节省内存简化子系统接口控制对真实对象的访问
持有的对象1个(包装链)多个共享实例多个子系统1个(真实对象)
接口一致性完全一致一致简化版接口完全一致(客户端无感)
典型时机运行时层层加大量对象时共享调用复杂系统时延迟/控制/保护访问时
典型场景流加密/日志游戏树木/字符视频转码懒加载、远程代理、保护代理
口号“层层叠加”“千物一面共享”“一键搞定”“替身先上,真身后到”
真实软件例子:图片懒加载(GUI/游戏常见)
#include<iostream>#include<memory>#include<string>usingnamespacestd;// 1. 统一图片接口classImage{public:virtual~Image()=default;virtualvoiddisplay()=0;virtualstringname()const=0;};// 2. 真实图片(加载很贵)classRealImage:publicImage{string filename;public:explicitRealImage(conststring&file):filename(file){loadFromDisk();// 真正昂贵的操作}private:voidloadFromDisk(){cout<<"[RealImage] 从磁盘/网络加载大图: "<<filename<<" (100MB)... 耗时5秒\n";// 模拟耗时加载:真实项目里这里读文件、解码等}public:voiddisplay()override{cout<<"[RealImage] 显示高清图: "<<filename<<endl;}stringname()constoverride{returnfilename;}};// 3. 代理图片(关键:懒加载 + 接口完全一致)classProxyImage:publicImage{string filename;unique_ptr<RealImage>realImage;// 真实对象,延迟创建public:explicitProxyImage(conststring&file):filename(file){cout<<"[ProxyImage] 创建代理(只存文件名,不加载)\n";}voiddisplay()override{if(!realImage){// 第一次使用才加载cout<<"[ProxyImage] 首次显示,触发懒加载...\n";realImage=make_unique<RealImage>(filename);}realImage->display();}stringname()constoverride{returnfilename;}};
客户端:完全无感代理的存在
intmain(){// 创建10张图片代理(启动瞬间完成,几乎不耗内存)vector<unique_ptr<Image>>gallery;for(inti=1;i<=10;++i){gallery.push_back(make_unique<ProxyImage>("photo_"+to_string(i)+".raw"));}cout<<"\n=== 程序启动完成,用户开始浏览 ===\n\n";// 用户只看第1张时,才真正加载gallery[0]->display();// 再看第5张,又触发一次加载cout<<"\n用户翻到第5张...\n";gallery[4]->display();// 重复看第1张?秒开!因为已经缓存了cout<<"\n用户又回到第1张...\n";gallery[0]->display();}

输出:

[ProxyImage] 创建代理(只存文件名,不加载) x10 === 程序启动完成,用户开始浏览 === [ProxyImage] 首次显示,触发懒加载... [RealImage] 从磁盘/网络加载大图: photo_1.raw (100MB)... 耗时5秒 [RealImage] 显示高清图: photo_1.raw 用户翻到第5张... [ProxyImage] 首次显示,触发懒加载... [RealImage] 从磁盘/网络加载大图: photo_5.raw (100MB)... 耗时5秒 [RealImage] 显示高清图: photo_5.raw 用户又回到第1张... [RealImage] 显示高清图: photo_1.raw ← 秒开!
代理模式的几种变体(真实项目常见)
类型作用典型场景
虚代理延迟加载(上面例子)图片/视频懒加载、大对象初始化
远程代理代表网络另一端的对象RPC、WebService、分布式对象
保护代理权限控制只有管理员能调用某些方法
缓存代理缓存结果数据库查询结果缓存
智能引用引用计数、日志共享资源管理
C++ 真实项目里无处不在
  • Qt:QPixmap/QImage懒加载,QNetworkAccessManager的缓存代理
  • 游戏引擎:Texture/Asset的Proxy(Unreal的Asset Registry)
  • ORM:数据库实体对象的延迟加载(Hibernate的Proxy类似)
  • 智能指针:shared_ptr在某些实现里有引用计数代理行为
  • Web框架:HTTP客户端的连接池代理
终极口诀(程序员专属)

“真身贵重别急造,代理先把活儿干;
需要之时再加载,内存速度两不耽!”

刻在DNA里的一句话

当你有一个“访问成本高昂的对象”(大文件、网络、权限控制),且不想每次都立即创建/加载时,
立刻上代理模式——用一个轻量替身控制访问,客户端完全无感,性能和资源双赢!

现在,结构型模式7种全部完结
下一期正式进入行为型模式,第一篇是责任链模式(Chain of Responsibility)[13]。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 2:26:43

xshell能连上ubuntu24而vscode连接不上_临时关闭 Windows 防火墙

&#x1f512; 关闭防火墙的几种方法 您可以根据自己的使用习惯选择以下任一方式。请注意&#xff0c;所有操作均需管理员权限。方法特点/适用场景通过“设置”应用界面直观&#xff0c;适合大多数用户&#xff0c;可分别管理不同网络类型的防火墙。通过控制面板传统方式&#…

作者头像 李华
网站建设 2026/5/10 7:40:07

MCP续证考试预约全流程揭秘:90%考生忽略的关键步骤

第一章&#xff1a;MCP续证考试预约全流程概述对于已获得微软认证专业人员&#xff08;MCP&#xff09;资格的技术从业者&#xff0c;定期完成续证考试是维持认证有效性的重要环节。整个预约流程涵盖资格验证、考试选择、时间安排与确认等多个阶段&#xff0c;需通过微软官方认…

作者头像 李华
网站建设 2026/5/2 19:51:42

12、深入理解FlowTrace:函数调用追踪利器

深入理解FlowTrace:函数调用追踪利器 1. 引言 在调试和性能分析中,了解代码中方法调用的流程至关重要。传统的 wt 命令虽然能实现方法调用流程的追踪,但它仅适用于控制台应用程序,且由于使用调试步进机制,速度较慢。为了实现快速且易用的追踪输出, FlowTrace 工具应…

作者头像 李华
网站建设 2026/4/22 11:44:14

Kimi K2,开源万亿参数大模型

Kimi K2&#xff0c;开源万亿参数大模型Kimi K2方案部署基于 MaaS 调用 Kimi-K2-Instruct 模型创建API-KEY下载安装Cherry Studio体验 Kimi 模型MCP 调用能力体验感受Kimi K2 在开始部署之前&#xff0c;先简单介绍一下Kimi K2。Kimi-K2-Instruct 是由月之暗面&#xff08;Moo…

作者头像 李华
网站建设 2026/5/11 8:14:56

GSE宏编译器:彻底改变你的魔兽世界游戏体验

GSE宏编译器&#xff1a;彻底改变你的魔兽世界游戏体验 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. It uses Travis for UnitTests, Coveralls to report on test coverage and the Curse p…

作者头像 李华