news 2026/7/7 19:40:32

设计模式[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/7/7 18:18:08

小熊猫Dev-C++终极配置手册:从零基础到专业开发

在众多C集成开发环境中&#xff0c;小熊猫Dev-C以其轻量级特性和开箱即用的优势脱颖而出。作为经典Dev-C的现代化升级版本&#xff0c;它不仅保留了原有的简洁界面&#xff0c;更融入了现代开发工具链的诸多实用功能。 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项…

作者头像 李华
网站建设 2026/7/7 7:39:57

DamaiHelper大麦抢票神器:告别手速焦虑的智能解决方案

DamaiHelper大麦抢票神器&#xff1a;告别手速焦虑的智能解决方案 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 你是否经历过这样的场景&#xff1a;演唱会开票瞬间&#xff0c;网页卡顿、按钮…

作者头像 李华
网站建设 2026/7/7 0:56:32

Adobe Illustrator效率提升完整指南:自动化脚本终极解决方案

Adobe Illustrator效率提升完整指南&#xff1a;自动化脚本终极解决方案 【免费下载链接】illustrator-scripts Some powerfull JSX scripts for extending Adobe Illustrator 项目地址: https://gitcode.com/gh_mirrors/ill/illustrator-scripts 还在为重复的设计操作消…

作者头像 李华
网站建设 2026/7/7 18:39:30

【专家亲授】MCP PL-600 Agent权限分级设计的7个致命误区及规避方法

第一章&#xff1a;MCP PL-600 Agent权限分级设计的核心理念在构建企业级自动化平台时&#xff0c;MCP PL-600 Agent的权限分级机制是保障系统安全与操作合规的关键。该设计遵循“最小权限原则”和“职责分离”两大核心思想&#xff0c;确保每个Agent仅能访问其执行任务所必需的…

作者头像 李华
网站建设 2026/7/7 10:41:09

DownKyi终极指南:轻松下载B站8K超高清视频的免费利器

DownKyi终极指南&#xff1a;轻松下载B站8K超高清视频的免费利器 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#x…

作者头像 李华
网站建设 2026/7/7 13:05:51

揭秘MCP Azure量子监控难题:3大工具助你实现毫秒级响应

第一章&#xff1a;MCP Azure 量子监控的挑战与演进随着量子计算在微软Azure平台上的逐步落地&#xff0c;MCP&#xff08;Microsoft Cloud Platform&#xff09;对量子系统的监控需求日益复杂。传统监控工具难以应对量子比特状态的高动态性、叠加态测量的不确定性以及量子门操…

作者头像 李华