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

文章目录

  • 定义
  • 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 函数里可以看到,多次调用展示方法时,后续调用不会重复加载图像,提高了效率(在更复杂的场景下能体现出资源利用等方面的优势)。最后要记得释放内存,避免内存泄漏。

仔细想一下,智能指针好像有点代理模式的意思。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942227.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA开发入门学习七- 数组

数组的概念 概念 数组&#xff1a; 是多个相同类型数据按照一定排列的集合&#xff0c;并使用一个名字命名&#xff0c;并通过编号的方式对这些数据进行统一管理 数组中的概念 数组名&#xff1a; 数组的名称&#xff0c;命名 下标&#xff1a; 从0开始 元素&#xff1a;…

ECharts热力图-笛卡尔坐标系上的热力图,附视频讲解与代码下载

引言&#xff1a; 热力图&#xff08;Heatmap&#xff09;是一种数据可视化技术&#xff0c;它通过颜色的深浅变化来表示数据在不同区域的分布密集程度。在二维平面上&#xff0c;热力图将数据值映射为颜色&#xff0c;通常颜色越深表示数据值越大&#xff0c;颜色越浅表示数…

【解决问题】Java2DRenderer生成图片时中文乱码 Linux安装字体

一&#xff0c;问题 在使用Java2DRenderer框架将html生成图片时&#xff0c;html中的中文文本在图片上显示框框&#xff0c;即出现了中文乱码。在确认使用正确的字符编码utf-8之后&#xff0c;并且确认了修改成unicode也同样乱码的情况下&#xff0c;找到了真正的原因&#xf…

HTMLCSSJavaScriptDOM 之间的关系?

一、HTML 中文名&#xff1a;超文本标记语言 英文名&#xff1a;HyperText Markup Language HTML是一种用来结构化Web网页及其内容的标记语言。 HTML 由一系列的元素组成&#xff0c;这些元素可以用来包围不同部分的内容&#xff0c;使其以某种方式呈现或者工作。 图Ⅰ 每…

Linux系统编程深度解析:C语言实战指南

文章一览 前言一、gcc编译系统1.1 文件名后缀1.2 C语言编译过程1.3 gcc命令行选项 二、gdb程序调试工具2.1 启动gdb和查看内部命令2.2 显示源程序和数据2.2.1 显示和搜索源程序2.2.2 查看运行时数据 2.3 改变和显示目录或路径2.4 控制程序的执行2.4.1 设置断点2.4.2 显示断点2.…

使用QML实现播放器进度条效果

使用QML实现播放进度效果 QML Slider介绍 直接上DEMO如下&#xff1a; Slider {width: 300;height: 20;orientation: Qt.Vertical; //决定slider是横还是竖 默认是HorizontalstepSize: 0.1;value: 0.2;tickmarksEnabled: true; //显示刻度}效果图如下 那么我先改变滑块跟滚轮…

云数智融合体系建设实践——以工行软件开发中心为例

随着“云计算第三次浪潮”的涌动&#xff0c;业界正见证着一场围绕“算力”的结构性变革。云计算、大数据、人工智能三大核心技术的深度融合&#xff0c;正推动着算力基础设施的快速发展&#xff0c;实现算力的高效调度与利用&#xff0c;也标志着业界对云计算体系布局的全新理…

评估大语言模型在药物基因组学问答任务中的表现:PGxQA

​这篇文献主要介绍了一个名为PGxQA的资源&#xff0c;用于评估大语言模型&#xff08;LLM&#xff09;在药物基因组学问答任务中的表现。 研究背景 药物基因组学&#xff08;Pharmacogenomics, PGx&#xff09;是精准医学中最有前景的领域之一&#xff0c;通过基因指导的治疗…

com.google.common.collect.ImmutableList$SerializedForm

今天AndroidStudio安装了个2021版本的&#xff0c;gradle用了7.3.3&#xff0c;创建项目后控制台总是有这样一个错误&#xff1a; Unable to load class com.google.common.collect.ImmutableList$SerializedForm. This is an unexpected error. Please file a bug containing…

[机器学习]sklearn入门指南(2)

上一篇文章中&#xff0c;我们介绍了如何用sklearn训练和预测模型&#xff0c;以及缺失值处理&#xff0c;详见[机器学习]sklearn入门指南&#xff08;1&#xff09; 分类变量 分类变量&#xff08;Categorical Variable&#xff09;&#xff0c;也称为定性变量&#xff08;Q…

CentOS下,离线安装vscode的步骤;

前置条件&#xff1a; 1.CentOS7; 步骤&#xff1a; 1.下载vscode指定版本&#xff0c;例如&#xff1b; 例如 code-1.83.1-1696982959.el7.x86_64.rpm 2.使用下面命令&#xff1a; sudo rpm -ivh code-1.83.1-1696982959.el7.x86_64.rpm 其他&#xff1a; 卸载vscode的命…

AI一键制作圣诞帽头像丨附详细教程

我用AI换上圣诞帽头像啦~&#x1f385; 不管是搞笑表情、宠物头像还是你的自拍&#xff01;&#xff01;都能一键添加圣诞帽元素&#xff0c;毫无违和感&#xff01;&#x1f389; 详细教程在P3、P4&#xff0c;手残党也能轻松搞定&#xff01; 宝子们需要打“need”&#xff0…

基于java博网即时通讯软件的设计与实现【源码+文档+部署讲解】

目 录 1. 绪 论 1.1. 开发背景 1.2. 开发意义 2. 系统设计相关技术 2.1 Java语言 2.2 MySQL数据库 2.3 Socket 3. 系统需求分析 3.1 可行性分析 3.2 需求分析 3.3 系统流程图 3.4 非功能性需求 4. 系统设计 4.1 系统功能结构 4.2 数据库设计 5. 系统实现 5.…

智能公文写作一体机,开箱即用快速部署超便捷

在繁忙的政企事业单位中&#xff0c;时间就是生产力。公文撰写作为各类组织日常工作的核心环节&#xff0c;却常常因为传统的公文处理流程繁琐耗时而成为效率的瓶颈。如何打破这一瓶颈&#xff0c;实现高效的公文撰写&#xff0c;成为了众多单位关注的焦点。 一款即开即用的公文…

idea2024创建JavaWeb项目以及配置Tomcat详解

今天呢&#xff0c;博主的学习进度也是步入了JavaWeb&#xff0c;目前正在逐步杨帆旗航&#xff0c;迎接全新的狂潮海浪。 那么接下来就给大家出一期有关JavaWeb的配置教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正…

从零开始使用MaxKB打造本地大语言模型智能问答系统与远程交互

文章目录 前言1. 下载运行Ollama2. 安装大语言模型3. 安装Cpolar工具4. 配置公网地址5. 固定公网地址6. MaxKB 添加Olama7.创建问答应用 前言 目前大语言模型&#xff08;LLM&#xff09;已经成为了人工智能领域的一颗璀璨明星&#xff0c;从自然语言处理到智能问答系统&#…

二年级数学知识边界总结思考-下册

目录 一、背景二、过程1.数据收集和整理一、知识点二、由来三、作用和意义 2.图形的运动一、知识点二、由来三、作用和意义 3.小小设计师一、知识点二、由来三、作用和意义 4.克和千克一、知识点二、由来三、作用和意义 5.数学广角-推理一、知识点二、由来三、作用和意义 三、总…

企业数字化转型加速,现代 IT 如何用 Datadog 全面提升可观测性?

作为 Gartner 可观测平台魔力象限的领导者&#xff0c;Datadog 凭借全面的功能、直观的用户界面和强大的产品路线图赢得了全球企业的信任。 企业 IT 架构正变得日益复杂&#xff0c;从本地服务器到云端部署&#xff0c;从单体应用向微服务&#xff0c;还有容器、 Kubernetes 等…

绕组识别标签规范

有标签名称的要标记&#xff0c;没有的不用标记 需要标注的工具、器材 图像中文名称标签名称od脱模剂watering can2铁铲shovel1记号笔&#xff0c;白色着重标bluepen/whitepen6纸质标签label3钢尺scale5玻璃纤维带&#xff08;卷&#xff09;红色网格布red grid4白色网格布wh…

NPM老是无法install,timeout?npm install失败

NPM老是无法install&#xff0c;timeout&#xff1f; 尝试一下如下操作 一、 更换国内源 npm config set registry https://registry.npmmirror.com npm install或指定源install npm install pkg --registry https://registry.npmmirror.com --legacy-peer-deps如下图 二…