【22】c++设计模式——>享元模式

享元模式的定义

1.结构型设计模式
2.旨在通过共享对象来最小化内存使用和提高性能
3.享元模式将对象分为可共享的内部状态和不可共享的外部状态,以便多个对象可以共享相同的内部状态

实现步骤

1.定义抽象享元类:定义一个抽象享元类,它声明了享元对象的操作,并且包含对外部状态进行操作的接口。
2.实现具体享元类:创建具体的享元类,实现了抽象享元类的操作。具体享元类包含了内部状态,并且可以被共享。
3.创建享元工厂类:创建一个享元工厂类,用于管理和提供享元对象。享元工厂类维护了一个享元对象的池,用于存储已经创建的享元对象。
4.使用享元对象:客户端可以通过享元工厂类请求享元对象并使用它们。客户端可以设置或传递外部状态给享元对象,以便个性化地使用享元对象。

代码实例

一个实际的享元模式场景是图形编辑器中的绘图工具。
在一个图形编辑器中,我们可以使用不同的绘图工具(例如画笔、橡皮擦、填充桶等)来创建和编辑图形。每个绘图工具都有自己的属性(例如颜色、线条粗细等),并且可以在画布上执行操作(例如绘制、擦除等)。
在这种情况下,享元模式可以用于管理绘图工具对象的共享。具体而言,享元模式将绘图工具对象分为两部分:内部状态和外部状态。
内部状态:内部状态是指可以被多个绘图工具对象共享的状态,这些状态在绘图工具对象之间不会发生变化。在这个场景中,例如绘图工具的形状、线型等属性是属于内部状态的。
外部状态:外部状态是指会随着绘图工具对象的不同而变化的状态,需要由客户端传递给享元对象。在这个场景中,例如绘图工具的位置、颜色等属性是属于外部状态的。
通过享元模式,我们可以共享绘图工具对象的内部状态,并通过传递不同的外部状态来实现绘图操作。这样可以有效地减少创建大量相似对象的内存消耗,并提高系统的性能。
以下是一个简化的示例代码,演示了在图形编辑器中使用享元模式来管理绘图工具对象的情况:

#include <iostream>
#include <unordered_map>
#include<map>//定义抽象类:绘图工具类(圆形,矩形)等
class DrawingTool
{
public:virtual void draw(int x, int y) = 0; //对外部状态进行操作的接口
};
//实现具体的享元类:具体的绘图工具类
class Brush :public DrawingTool
{
public:explicit Brush(const std::string& shape) :m_shape(shape) {}void draw(int x, int y)override{std::cout << "Drawing " << m_shape << " at position (" << x << ", " << y << ") with brush" << std::endl;}
private:
std::string m_shape;
};
//享元工厂类
class DrawingToolFactory
{
public:DrawingTool* getBrush(const std::string& shape){if (m_brushes.find(shape) == m_brushes.end()){//没找到,就创建一个新的m_brushes[shape] = new Brush(shape);}return m_brushes[shape];}
private:std::map<std::string, DrawingTool*>m_brushes;
};int main()
{DrawingToolFactory factory;DrawingTool* brush1 = factory.getBrush("Circle");brush1->draw(10,10);DrawingTool* brush2 = factory.getBrush("Square");brush2->draw(20, 20);DrawingTool* brush3 = factory.getBrush("Circle");brush1->draw(30, 30);return 0;}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【沧元图】玉阳宫主是正是邪,和面具人有勾结吗?现在已有答案了

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析沧元图。 沧元图这部动漫中&#xff0c;有一个很特殊的人物&#xff0c;也是一个让人看不透的人物&#xff0c;因为很多人都不知道这个人是正还是邪&#xff0c;这个人就是玉阳宫主。 因为这个人明面上是掌管东宁府维护东…

【爬虫实战】用pyhon爬百度故事会专栏

一.爬虫需求 获取对应所有专栏数据&#xff1b;自动实现分页&#xff1b;多线程爬取&#xff1b;批量多账号爬取&#xff1b;保存到mysql、csv&#xff08;本案例以mysql为例&#xff09;&#xff1b;保存数据时已存在就更新&#xff0c;无数据就添加&#xff1b; 二.最终效果…

SecureCRT 自动测试脚本的使用方法

脚本示例&#xff08;get_batteryifo_interval_2s.vbs&#xff09;&#xff1a; Sub Main Do While(1)crt.Screen.Send "pm_client batteryinfo" & chr(13)crt.Sleep 2000 Loop End Sub 1. 解压 SecureCRT 压缩包&#xff08;网上下载&#xff09;&#xff1b…

机器学习 Q-Learning

对马尔可夫奖励的理解 看的这个教程 公式&#xff1a;V(s) R(s) γ * V(s’) V(s) 代表当前状态 s 的价值。 R(s) 代表从状态 s 到下一个状态 s’ 执行某个动作后所获得的即时奖励。 γ 是折扣因子&#xff0c;它表示未来奖励的重要性&#xff0c;通常取值在 0 到 1 之间。…

Maven项目,进行编译,使用idea的 编译功能,就是正常的,但是在终端中执行 mvn clean compile 报错

一、背景&#xff1a; Maven项目&#xff0c;进行编译&#xff0c;使用idea的 编译功能&#xff0c;就是正常的&#xff0c;但是在终端中执行 mvn clean compile 报错 报错信息&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin…

XGBoost+LR融合

1、背景简介 xgboostlr模型融合方法用于分类或者回归的思想最早由facebook在广告ctr预测中提出&#xff0c;其论文Practical Lessons from Predicting Clicks on Ads at Facebook有对其进行阐述。在这篇论文中他们提出了一种将xgboost作为feature transform的方法。大概的思想…

Qt如何实现动态背景-视频背景

前言 需求&#xff1a;加载视频作为视频背景&#xff0c;在上层可以进行图片的动画化&#xff0c;或是进行其他操作。 几种方法&#xff1a; 1、直接将视频弄成一个QDialog&#xff0c; 然后再上层在弄一个QDialog,背景透明即可。但遇到一个问题&#xff0c;QDialog没办法局…

ffmpeg的重采样计算

最近在看ffmpeg的重采样计算逻辑&#xff0c;有一句话没大看懂 dst_nb_samples av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) src_nb_samples, dst_rate, src_rate, AV_ROUND_UP); &#xff0c;各种请教之后&#xff0c;记录如下。 重采样后的总样本数 为什么要涵盖重采…

计算机视觉--通过HSV和YIQ颜色空间处理图像噪声

计算机视觉 文章目录 计算机视觉前言一、实现步骤二、实现总结 前言 利用HSV和YIQ颜色空间处理图像噪声。在本次实验中&#xff0c;我们使用任意一张图片&#xff0c;通过RGB转HSV和YIQ的操作&#xff0c;加入了椒盐噪声并将其转换回RGB格式&#xff0c;最终实现对图像的噪声处…

chatGLM2-6B模型LoRA微调数据集实现大模型的分类任务

【TOC】 1.chatglm介绍 ChatGLM 模型是由清华大学开源的、支持中英双语问答的对话语言模型,并针对中文进行了优化。该模型基于 General Language Model(GLM)架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署。 ChatGLM 具备以下特点: 充…

AlmaLinux (兼容centos)安装Geant4与ROOT

AlmaLinux 介绍 AlmaLinux OS 是一个开源、社区驱动的 Linux 操作系统&#xff0c;它填补了因 CentOS 稳定版本停止维护而留下的空白&#xff0c;同时更加强大。 安装 AlmaLinux 这个我用的是 windows 子系统进行安装 首先打开微软商店&#xff0c;然后搜索AlmaLinux&#…

使用XLua在Unity中获取lua全局变量和函数

1、Lua脚本 入口脚本 print("OK") --也会执行重定向 require("Test") 测试脚本 print("TestScript") testNum 1 testBool true testFloat 1.2 testStr "123"function testFun()print("无参无返回") endfunction te…

【想法】取代NI的 PCIe-8371

PCIe-8371 涨价非常厉害。 PCA3 https://www.terasic.com.tw/cgi-bin/page/archive.pl?LanguageEnglish&CategoryNo65&No1143 PCA3 (PCIe Cable Adapter, Gen 3) is a conversion card to connect boards with your host PC. It can support up to PCIe Gen 3 x4. …

luajit简介

LuaJIT是一种高效的Lua解释器&#xff0c;其通过即时编译技术将Lua代码转换为机器代码&#xff0c;从而提供了非常快速的执行速度。在本文中&#xff0c;我们将介绍LuaJIT的原理、使用方法以及在嵌入式Linux系统中的应用示例。 LuaJIT的原理 LuaJIT基于Lua 5.1实现&#xff0…

Java前后端交互的一些细节

在后端进行POST请求后端接收前端数据时&#xff0c;关于PrintWriter&#xff1a;参考地址 注意传进来的对象为空说明未在数据库查到拥有该账号的用户&#xff0c;所以需要告诉前端“账号密码不正确”&#xff0c;如果不为空说明有该用户&#xff0c;所以可以登录。 Overridep…

基于天牛须优化的BP神经网络(分类应用) - 附代码

基于天牛须优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于天牛须优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.天牛须优化BP神经网络3.1 BP神经网络参数设置3.2 天牛须算法应用 4.测试结果&#x…

sql注入(6), 更新注入, 堆叠注入, 宽字节注入

一, 更新注入 更新操作只返回布尔型结果, 所以无法像select语句进行多样化测试, 所以更新类的操作重点就是报错注入. 注意报错注入的前提是页面上能够看到数据库的报错信息, 利用报错信息显示我们需要的数据. 情景 修改密码时对url进行post请求, 提交密码. url: http://192.…

vscode虚拟环境使用jupyter

在某虚拟环境内安装torch&#xff0c;但是ipyn文件保存后无法正常导入torch 1.conda环境下安装Jupyter等一切配置&#xff0c;进入虚拟环境 2.conda install nb_conda_kernels 3.安装完成后重新打开VSCode&#xff0c;在运行Jupyter notebook中的代码之前&#xff0c;在右上…

微软和OpenAI正在开发AI芯片, 并计划下个月发布

今年初&#xff0c;Chat**引起了无数网友关注&#xff0c;一度成为了热门话题。这是由人工智能研究实验室OpenAI开发的一款聊天机器人模型&#xff0c;也称为一种人工智能&#xff08;AI&#xff09;技术驱动的自然语言处理工具。能够通过学习和理解人类的语言来进行对话&#…

百度SEO优化全攻略(提高网站排名的5个方面)

百度SEO入门介绍&#xff1a; 随着互联网的不断发展&#xff0c;SEO已经成为网站优化的重要一环。而百度作为中国最大的搜索引擎&#xff0c;其SEO优化更是至关重要。SEO不仅能够提高网站排名&#xff0c;还能够提高网站流量、用户体验以及品牌知名度。因此&#xff0c;掌握百…