重撸设计模式--代理模式
文章目录
- 定义
- UML图
- 代理模式主要有以下几种常见类型:
- 代理模式涉及的主要角色有:
- C++ 代码示例
定义
代理模式(Proxy Pattern)属于结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。
通过引入代理对象,代理模式可以在目标对象的基础上,增加额外的功能,比如访问控制、懒加载、缓存等,同时对外界隐藏目标对象的实现细节,让调用者感觉好像是在直接与目标对象进行交互。
UML图
代理模式主要有以下几种常见类型:
远程代理(Remote Proxy):用于代表一个在不同地址空间(比如网络上的不同服务器)的对象,使得客户端可以像访问本地对象一样访问远程对象。
虚拟代理(Virtual Proxy):根据需要创建开销较大的对象,比如在真正需要访问对象时才去实例化它,常用于实现图片懒加载等功能,在图片要显示时才加载图片资源。
保护代理(Protection Proxy):控制对原始对象的访问权限,根据不同的权限决定是否允许调用者执行相应的操作。
代理模式涉及的主要角色有:
抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样客户端在使用时可以以统一的方式与真实对象或代理对象进行交互。
真实主题(Real Subject):实现了抽象主题接口,是实际完成业务逻辑的对象,也就是被代理的对象。
代理(Proxy):同样实现了抽象主题接口,内部包含一个指向真实主题对象的指针,它可以在调用真实主题的方法前后添加额外的逻辑,来实现对真实主题的访问控制等功能。
C++ 代码示例
以下是一个简单的代理模式示例,模拟一个简单的图像加载展示场景,这里使用虚拟代理的思路,先创建代理对象,在真正需要展示图像(调用 display 方法)时才去加载并展示真实的图像(这里只是简单模拟加载逻辑)。
#include <iostream>
#include <string>// 抽象主题,定义图像操作的接口
class Image
{
public:virtual void display() = 0;virtual ~Image() {}
};// 真实主题,代表实际的图像,这里简单模拟图像有个文件名属性及加载展示逻辑
class RealImage : public Image
{
private:std::string fileName;
public:RealImage(const std::string& name) : fileName(name) {loadFromDisk();}void display() override{std::cout << "Displaying image: " << fileName << std::endl;}
private:void loadFromDisk(){std::cout << "Loading image from disk: " << fileName << std::endl;}
};// 代理类,代表图像的代理,在需要时才创建真实图像对象并调用其方法
class ProxyImage : public Image
{
private:RealImage* realImage;std::string fileName;
public:ProxyImage(const std::string& name) : realImage(nullptr), fileName(name) {}void display() override{//在此,可以对被代理的对象的操作进行额外操作;//不允许显示特定的图片,异常处理,或者重新解码显示,加水印等等任何实际需求都可以在此添加if (!realImage){realImage = new RealImage(fileName);}realImage->display();}~ProxyImage() {delete realImage;}
};int main()
{// 创建代理对象,此时并没有真正加载图像Image* image = new ProxyImage("example.jpg");// 第一次调用 display,会触发真实图像的加载和展示image->display();// 第二次调用 display,因为已经加载过了,直接展示,不会重复加载image->display();delete image;char t;std::cin>>t;return 0;
}
在上述代码中:
Image 作为抽象主题,定义了 display 这个抽象方法,表示图像展示的操作,客户端只需要和这个接口进行交互。
RealImage 是真实主题,它实现了 Image 接口,内部有图像文件名属性,并且在构造函数中会进行从磁盘加载图像的模拟操作,在 display 方法中展示图像。
ProxyImage 为代理类,它也实现了 Image 接口,内部有一个指向 RealImage 的指针以及图像文件名属性。在 display 方法中,先判断真实图像是否已经创建,如果没有创建就实例化 RealImage,然后调用真实图像的 display 方法来展示图像。这样就实现了在真正需要展示图像时才去加载它的虚拟代理功能,并且在 main 函数里可以看到,多次调用展示方法时,后续调用不会重复加载图像,提高了效率(在更复杂的场景下能体现出资源利用等方面的优势)。最后要记得释放内存,避免内存泄漏。
仔细想一下,智能指针好像有点代理模式的意思。
相关文章:
重撸设计模式--代理模式
文章目录 定义UML图代理模式主要有以下几种常见类型:代理模式涉及的主要角色有:C 代码示例 定义 代理模式(Proxy Pattern)属于结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…...
“从零到一:揭秘操作系统的奇妙世界”【操作系统系统调用】
【1】定义 系统调用是用户空间程序请求操作系统服务的一种机制。系统调用的调用程序运行在用户态,被调用程序运行在内核态。系统调用可以嵌套使用。系统调用是通过中断机制实现的,并且一个OS的所有系统调用都通过一个中断入口来实现参数通常通过寄存器传…...
MQTT协议常见问题
在MQTT协议中,发送DISCONNECT报文与在TCP层调用network_disconnect(或类似的函数,具体名称可能因实现而异)之间存在重要的关系,这涉及到协议的正确性和资源的正确释放。 ### MQTT DISCONNECT报文 MQTT DISCONNECT报文…...
ArcGIS计算土地转移矩阵
在计算土地转移矩阵时,最常使用的方法就是在ArcGIS中将土地利用栅格数据转为矢量,然后采用叠加分析计算,但这种方法计算效率低。还有一种方法是采用ArcGIS中的栅格计算器,将一个年份的地类编号乘以个100或是1000再加上另一个年份的…...
数据结构十大排序之(冒泡,快排,并归)
接上期: 数据结十大排序之(选排,希尔,插排,堆排)-CSDN博客 前言: 在计算机科学中,排序算法是最基础且最重要的算法之一。无论是大规模数据处理还是日常的小型程序开发,…...
MySql:基本查询
✨✨作者主页:嶔某✨✨ ✨✨所属专栏:MySql✨✨ 本文的代码中, [ ] 里面的都可以省略 在 MySQL 中,CRUD 是数据库操作的核心,代表以下四种基本操作: C(Create):创建、插…...
28、基于springboot的房屋租赁系统
房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 本文重点阐述了房屋租赁系统的开发过程&…...
96 vSystem
vSystem系统 1 技术背景 网络虚拟化旨在构建出一套与网络底层物理拓扑相互独立的逻辑网络环境,提供给不同需求的用户使用。基于这种思想,诞生出了 VLAN 技术和 VPN 技术。近年来, 随着以 VMM(Virtual Machine Monitor,…...
[创业之路-197]:华为的发展路径启示
目录 前言: 一、由小公司走向大公司: 二、由农村包围城市: 三、由国内走向国际: 四、由代理商走向设备商,再到系统方案商,再到生态系统的搭建: 五、由随性到跟随,到赶超&#…...
两款Windows电脑便签,常用的电脑桌面便签小工具推荐
现在的职场环境中,效率高低会影响我们的去留以及晋升,而电脑便签无疑是提高效率的重要辅助工具。对于Windows电脑的用户来说,选择合适的电脑桌面便签小工具尤为重要。今天为大家推荐两款使用过且好用实用的Windows电脑便签,希望可…...
sql server索引优化语句
第一步 建一个测试表 --create table TestUsers --( -- Id int primary key identity(1,1), -- Username varchar(30) not null, -- Password varchar(10) not null, -- CreateDateTime datetime not null --)第二步 插入100w数据 大概1分钟执行时间 ----插入数据…...
从监控异常发现网络安全
前言 最近在前端异常监控系统中,发现一些异常信息,从中做了一些分析,得到一些体会,因此作文。 发现异常 某天早上打开监控系统发现,当天凌晨1点过测试环境有2个前端上报的异常,报错的原因都是由于没有获取…...
Android学习(七)-Kotlin编程语言-Lambda 编程
Lambda 编程 而 Kotlin 从第一个版本开始就支持了 Lambda 编程,并且 Kotlin 中的 Lambda 功能极为强大。Lambda 表达式使得代码更加简洁和易读。 2.6.1 集合的创建与遍历 集合的函数式 API 是入门 Lambda 编程的绝佳示例,但在开始之前,我们…...
中国人工智能学会技术白皮书
中国人工智能学会的技术白皮书具有多方面的重要作用,是极具权威性和价值的参考资料。 看看编委会和编写组的阵容,还是很让人觉得靠谱的 如何下载这份资料呢?下面跟着步骤来吧 步骤一:进入中国智能学会官网。百度搜索“中国智能学…...
【集合】Java 8 - Stream API 17种常用操作与案例详解
文章目录 Java8 Stream API 17种常用操作与案例详解1. collect():将流中的元素收集到集合中2. filter():根据条件过滤流中的元素3. map():元素映射为另一个值4. forEach():对流中的元素执行操作5. flatMap():将流中的元…...
Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器
文章目录 一、SpringWeb概述 二、SpringWeb特点 三、搭建SpringWeb(在web项目中) 1、导包 2、在web.xml文件中配置统一拦截分发器 DispatcherServlet 3、开启 SpringWEB 注解 4、处理器搭建 四、SpringWeb运行流程 五、SpringWeb组件 1、前端控…...
uni-app商品搜索页面
目录 一:功能概述 二:功能实现 一:功能概述 商品搜索页面,可以根据商品品牌,商品分类,商品价格等信息实现商品搜索和列表展示。 二:功能实现 1:商品搜索数据 <view class="search-map padding-main bg-base"> <view class…...
基于Spring Boot的远程教育网站
一、系统背景与意义 随着互联网技术的飞速发展和普及,远程教育已成为现代教育体系中的重要组成部分。它打破了时间和空间的限制,让学习者可以随时随地进行学习。基于Spring Boot的远程教育网站正是为了满足这一需求而设计的,它利用互联网技术…...
降低Mobx技术债问题-React前端数据流方案调研整理
我们现在主要是使用Mobx,但是Mobx的易于上手和灵活度也带来了很多预期以外的问题,随着项目的增长我们的代码技术债变得愈加沉重,不同的模块杂糅一起、单一store无限膨胀。 为此我们的调研是希望能找到一个更好的state配置、数据流的约定方案。…...
Linux通信System V:消息队列 信号量
Linux通信System V:消息队列 & 信号量 一、信号量概念二、信号量意义三、操作系统如何管理ipc资源(2.36版本)四、如何对信号量资源进行管理 一、信号量概念 信号量本质上就是计数器,用来保护共享资源。多个进程在进行通信时&a…...
STM32, GD32 cubemx CAN 低速率125kbps 报文丢失,解决了
用STM32 CUBEMX生成的GD32的 can程序,在500K波特率时可以正常使用,没有发现丢包,但速率降到250k和125k时,发送138帧数据,会丢失5个包。(系统时钟168M,APB1的时钟42M) 试了各种方法无…...
医疗服务品质提升:SSM 与 Vue 打造医院预约挂号系统方案
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了医院预约挂号系统的开发全过程。通过分析医院预约挂号系统管理的不足,创建了一个计算机管理医院预约挂号系统的方案。文章介绍了医院预约挂号系统的系…...
在UE5中调用ImGui图形界面库
ImGui是一个小巧灵活、简洁美观的图形界面库 首先我们直接参考Github https://github.com/SLSNe/Unreal5-ImGui 把项目下载下来后 打开项目目录或者引擎目录 项目根目录/Plugins/ImGui/ 或 UE5引擎根目录/Engine/Plugins/ 如果没有Plugins文件夹就新建一个 把项目放里面…...
汇聚点滴启迪思维(三)
switch存在的问题 缺少default语句 switch语句可以包含一个可选的default语句,用于处理没有与任何case标签匹配的情况。如果没有default语句,并且没有与表达式匹配的case标签,程序将不会执行任何操作。 除了case switch包含的大括号中间…...
C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容
我们有一个中文录音文件.mp3格式或者是.wav格式,如果我们想要提取录音文件中的文字内容,我们可以采用以下方法,不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…...
第18篇 :深入剖析systemverilog中 randomize 再谈失败案例(六)
今天,我们再谈一随机失败案例,希望再次同大家续探讨这块内容。 一 案例分析 我们先看一例子,代码如下: 上述代码中,共有5处使用 randomize 随机。它们的随机对象都是类 helloworld_test 中的 rand shortint unsigned counter ; 其中,counter 被赋予初始数值 66 。 …...
(耗时4天制作)详细介绍macOS系统 本博文含有全英版 (全文翻译稿)
(耗时4天制作)详细介绍macOS系统 本博文含有全英版-CSDN博客 全篇英文 Introduction to the macOS System I. Overview of macOS macOS is a proprietary operating system developed by Apple Inc., primarily used for Macintosh (Mac) computers. It is the first comme…...
React与Vue的区别(相同点和不同点)
前言 JavaScript是世界上最流行的语言之一,React和Vue是JS最流行的两个框架。但各有优缺点,本文将详细对比两大框架 一、框架背景 React React是由Facebook开发的用于构建用户界面的JavaScript库,Facebook对市场上JavaScript MVC框架都不太…...
flutter --no-color pub get 超时解决方法
新建Flutter项目后,运行报错,需要执行pub get 点击Run ‘flutter pub get’ … … … 卡着,不动了,提示超时 是因为墙的问题 解决方案: 添加以下环境变量 变量名: PUB_HOSTED_URL 变量值: https://pub.flutter-io.cn …...
MacPorts 中安装高/低版本软件方式,以 RabbitMQ 为例
查询信息 这里以 RabbitMQ 为例,通过搜索得到默认安装版本信息: port search rabbitmq-server结果 ~/Downloads> port search rabbitmq-server rabbitmq-server 3.11.15 (net)The RabbitMQ AMQP Server ~/Downloads>获取二进制文件 但当前官网…...
启动报错java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus
报错信息图片 日志: Exception in thread "Quartz Scheduler [scheduler]" java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus先说我自己遇到的问题,我们项目在web设置了自定义的log输出路径,多了一个 / 去…...
本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——11上位机与小车交互
本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——11上位机与小车交互 根据上一节的配置,目前已经建立了通讯环境,接下来给大家带来上位机与小车交互 这一章节里面也有图片大家去地瓜开发者社区看对应文章吧链接...
harbor离线安装 配置https 全程记录
1. 下载harbor最新版本 下载网址: 找最新的版本: https://github.com/goharbor/harbor/releases/download/v2.11.2/harbor-offline-installer-v2.11.2.tgz 这里我直接使用迅雷下载, 然后上传 1.1解压 sudo tar -xf harbor-offline-installer-v2.11.2.tgz -C /opt/ 2. 配置Harb…...
使用生存分析进行游戏时间测量
标题:Playtime Measurement with Survival Analysis 作者:Markus Viljanen, Antti Airola, Jukka Heikkonen, Tapio Pahikkala 译者:游戏数据科学 1 游戏中的游戏时间 1.1 为什么游戏时间很重要 游戏分析在理解玩家行为方面变得越来越重…...
Fiddler勾选https后google浏览器网页访问不可用
一、说明 最近电脑重新安装系统后,之前的所有工具都需要重新安装和配置,有个项目需要抓包https包查看一下请求的内容,通过Fiddler工具,但是开启后,发现https的无法抓取,同时google浏览器也不无法访问互联网…...
【信息系统项目管理师】高分论文:论信息系统项目的成本管理(社区网格化管理平台系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、规划成本管理二、估算成本三、制定预算四、控制成本论文 2022年6月,我作为项目经理负责了XX市社区网格化管理平台系统集成项目建设,该项目投资金额512.5万元,建设周期12个月。该项目由XX市综治办发…...
vscode配置markdown代码片段snippet不生效问题
markdown.json {"cpp code": {"prefix": "cpp","body": ["cpp","$1","",],"description": "cpp code"} }Ctrl Shift P 后输入settings ,然后选择open settings (json)ÿ…...
小脑萎缩与维生素补充:科学饮食,助力健康
小脑萎缩是一种神经影像学表现,常见于某些遗传症和神经系统变性类疾病,患者常表现出共济失调、语言功能障碍、眼球运动障碍以及肌肉功能障碍等症状。尽管小脑萎缩目前尚无完全治愈的方法,但通过合理的饮食调整和必要的维生素补充,…...
基于SSM+Vue的个性化旅游推荐系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着社会经济的快速发展和人民生活水平的不断提高,旅游业逐渐成为我国国民经济的重要支柱产业。然而,在旅游市场日益繁荣的背景下,游客对于旅游产品和服务的需求逐渐呈现出多样化和个性化的趋…...
灰狼优化算法(GWO)与狼群算法(WPA)的全面比较
灰狼优化算法(GWO)与狼群算法(WPA)都是基于狼群行为的智能优化算法,但它们在多个方面存在显著的区别。以下是对这两种算法的全方面比较: 一、算法起源与灵感 1. 灰狼优化算法(GWO)&…...
探索未知,乐享惊喜 —— 盲盒APP开发,开启您的个性化惊喜之旅!
在这个瞬息万变的数字时代,我们总在寻找那些能触动心灵、带来无限可能的小确幸。为了满足您对未知的好奇与对惊喜的渴望,我们匠心打造了一款全新的盲盒APP,旨在为您的生活增添一抹不同寻常的色彩,让每一次打开都是一次全新的探索与…...
音视频学习(二十五):ts
TS(MPEG-TS,MPEG Transport Stream) 是一种广泛应用于流媒体传输和存储的容器格式。它最早由 MPEG(Moving Picture Experts Group)组织制定,用于视频和音频的压缩编码。在 HLS(HTTP Live Stream…...
MVVM、MVC、MVP 的区别
MVVM(Model-View-ViewModel)、MVC(Model-View-Controller)和MVP(Model-View-Presenter)是三种常见的软件架构模式,它们在客户端应用开发中被广泛使用。每种模式都有其特定的设计理念和应用场景&…...
低延迟!实时处理!中软高科AI边缘服务器,解决边缘计算多样化需求!
根据相关统计,随着物联网的发展和5G技术的普及,到2025年,全球物联网设备连接数将达到1000亿,海量的计算数据使得传输到云端再处理的云计算方式显得更捉襟见肘。拥有低延迟、实时处理、可扩展性和更高安全性的边缘计算应运而生&…...
CSS|14 z-index
z-index z-index表示谁压盖着谁,数值大的会压盖住数值小的。只有定位的元素才有z-index值,只有设置了固定定位、相对定位、绝对定位了的元素,才会拥有z-indexz-index的值是没有单位的,值是一个正整数,默认的z-index值…...
Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索
作者:来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么? Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…...
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
目录 为什么要结合项目与算法? 1. 蓝桥杯与《苍穹外卖》项目的结合 实例:基于蓝桥杯算法思想的订单配送路径规划 问题描述: 代码实现:使用动态规划解决旅行商问题 代码解析: 为什么这个题目与蓝桥杯相关&#x…...
powershell基础(1)
powershell基础(1) 1. 安装PowerShell 首先,确保你的计算机上已经安装了PowerShell。对于Windows 10及更高版本,PowerShell通常是默认安装的。你也可以从微软官网下载并安装最新版本的PowerShell Core。 2. 打开PowerShell 在Windows搜索栏中输入“P…...
国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案
随着科技高速发展,视频信号经过数字压缩,通过互联网宽带或者移动4G网络传递,可实现远程视频监控功能。将这一功能运用于施工现场安全管理,势必会大大提高管理效率,提升监管层次。而这些,通过Liveweb监控系统…...
踩准智能汽车+机器人两大风口,速腾聚创AI+机器人应用双线爆发
日前,RoboSense速腾聚创交出了一份亮眼的Q3财报。受到多重利好消息影响,其股价也应势连续大涨。截止12月9日发稿前,速腾聚创股价近一个月内累计涨幅已超88%。 财务数据方面,速腾聚创在今年前三季度实现总收入约11.3亿元࿰…...