当前位置: 首页 > news >正文

重撸设计模式--代理模式

文章目录

  • 定义
  • 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图代理模式主要有以下几种常见类型&#xff1a;代理模式涉及的主要角色有&#xff1a;C 代码示例 定义 代理模式&#xff08;Proxy Pattern&#xff09;属于结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…...

Redis性能调优:深入剖析变慢原因及应对策略

如果观察到&#xff0c;这个实例的运行延迟是正常 Redis 基准性能的 2 倍以上&#xff0c;即可认为这个 Redis 实例确实变慢了。 1.如何查看实例的运行延迟 &#xff08;1&#xff09;redis-cli -h 127.0.0.1 -p 6379 --intrinsic-latency 60 执行该命令&#xff0c;就可以测…...

Python联合Halcon的详细教程

以下是一份Python联合Halcon的详细教程&#xff1a; 一、简介 Halcon是一款由德国MVTec公司开发的高级机器视觉软件&#xff0c;提供了一套强大的图像处理库&#xff0c;包括特征检测、识别、测量等功能。Python联合Halcon是一种将Python编程语言与计算机视觉库Halcon集成的应…...

raid 状态查看 storcli64

场景 当磁盘报错的时候使用该命令排查 fdisk -l /dev/sdb fdisk: cannot open /dev/sdb: Input/output error进一步使用 smartctl 排查 smartctl -a /dev/sdb 输出 smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-144-generic] (local build) Copyright (C) 2002-19, B…...

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…...

使用Docker启用MySQL8.0.11

目录 一、Docker减小镜像大小的方式 1、基础镜像选择 2、减少镜像层数 3、清理无用文件和缓存 4、优化文件复制&#xff08;COPY和ADD指令&#xff09; 二、Docker镜像多阶段构建 1、什么是dockers镜像多阶段构建 1.1 概念介绍 1.2 构建过程和优势 2、怎样在Dockerfil…...

Qt之修改窗口标题、图标以及自定义标题栏(九)

Qt开发 系列文章 - titles-icons-titlebars&#xff08;九&#xff09; 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时&#xff0c;经常需要修改窗口标题、更改软…...

每天40分玩转Django:Django测试

Django测试 一、今日学习内容概述 学习模块重要程度主要内容测试基础⭐⭐⭐⭐⭐TestCase、断言方法模型测试⭐⭐⭐⭐⭐模型方法、数据验证视图测试⭐⭐⭐⭐请求处理、响应验证表单测试⭐⭐⭐⭐表单验证、数据处理覆盖率测试⭐⭐⭐⭐coverage配置、报告生成 二、测试基础示例…...

JS子页面调用父页面函数,监听刷新事件

目录 1.子页面调用父页面的函数 2.监听刷新事件 1.子页面调用父页面的方法 我们先来说说什么是子页面&#xff0c;在我这里子页面就是域名一样&#xff0c;然后使用iframe引入的页面就是我所说的子页面&#xff0c;为什么需要用到这个功能&#xff0c;是为了实现跨页面交互与…...

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景&#xff1a;现在有一个新需求&#xff0c;需要借助树结构来实现词库的分类管理&#xff0c;树的节点是不同的分类&#xff0c;不同的分类可以有自己的词库&#xff0c;所以父子节点是互不影响的&#xff1b;同样为了选择的方便性&#xff0c;提出了新需求&#xff0c;选择…...

详细介绍如何使用rapidjson读取json文件

本文主要详细介绍如何使用rapidjson库来实现.json文件的读取&#xff0c;分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中&#xff0c;{} 和 [] 分别表示不同的数据结构&…...

【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget

目录 QLabel QFrame 例子&#xff1a; textFormat pixmap、scaledContents alignment wordWrap、indent、margin buddy QLCDNumber 例子&#xff1a; QTimer QProgressBar 例子&#xff1a; QCalendarWidget 例子&#xff1a; QLabel 标签控件&#xff0c;用来显示…...

设计模式-访问者设计模式

介绍 访问者模式&#xff08;Visitor&#xff09;&#xff0c;表示一个作用于某对象结构中的各元素的操作&#xff0c;它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。 问题&#xff1a;在一个机构里面有两种员工&#xff0c;1.Teacher 2.Engineer 员…...

Spring框架IOC

目录 一、Spring框架的介绍 1.1 Spring框架的概述 1.2 Spring框架的优点 二、Spring的核心 IOC技术 2.1 什么是IOC 2.2 IOC的程序入门 2.3 IOC技术总结 2.4 Spring框架的Bean管理的配置文件方式 一、Spring框架的介绍 1.1 Spring框架的概述 Spring是一个开放源代码的…...

有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?

想找个 “免费” 的 ERP 软件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全&#xff0c;能免费才怪呢&#xff01;真要是有免费的&#xff0c;早就火遍大江南北&#xff0c;说不定把市场都垄断了&…...

思科CCNA认证都学什么考什么?

关注 工 仲 好&#xff1a;IT运维大本营CCNA考试要学的东西很多&#xff0c;你不要看它只是一个初级认证&#xff0c;但是它的专业内容知识是不少的&#xff0c;你想要学好也是需要下一番苦功的。 那么考CCNA需要学哪些东西呢&#xff1f;下面我们就来了解一下吧。 01、考CCN…...

模型部署学习笔记——模型部署关键知识点总结

模型部署学习笔记——模型部署关键知识点总结 模型部署学习笔记——模型部署关键知识点总结1. CUDA中Grid和Block的定义是什么&#xff1f;Shared Memory的定义&#xff1f;Bank Conflict的定义&#xff1f;Stream和Event的定义&#xff1f;2. TensorRT的工作流程&#xff1f;3…...

22智能 狄克斯特拉算法复习

狄克斯特拉算法 图 根据边有无方向分为&#xff1a; 有向图、无向图 根据边有无权重变量分为&#xff1a; 有权图、无权图 根据顶点是否连通分为&#xff1a; 连通图和非连通图入度&#xff1a;表示有多少条边指向该顶点出度&#xff1a;表示有多少条边从该顶点指出算法步骤&a…...

首个!艾灵参编的工业边缘计算国家标准正式发布

近日&#xff0c;艾灵参与编制的《面向工业应用的边缘计算 应用指南》&#xff08;以下简称《标准》&#xff09;国家标准正式发布&#xff0c;将于2025年5月1日起实施。这一里程碑式的成果&#xff0c;不仅标志着我国在工业边缘计算技术标准化领域取得了重大突破&#xff0c;成…...

curl也支持断点续传

curl断点续传 访问外网资源&#xff0c;特别是Github上比较大的资源&#xff0c;例如&#xff0c;笔者遇到的calico发布包&#xff0c;经常会遇到在浏览器上下载半途中断。 那么支持断点续传的下载工具&#xff0c;就是应对这种情况的好帮手&#xff01; 简单的断点续传工具…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...