(三)行为模式:8、状态模式(State Pattern)(C++示例)
目录
1、状态模式(State Pattern)含义
2、状态模式的UML图学习
3、状态模式的应用场景
4、状态模式的优缺点
(1)优点
(2)缺点
5、C++实现状态模式的实例
1、状态模式(State Pattern)含义
状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。【DP】
”状态模式主要解决的是,当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单,那就没必要用‘状态模式’了 。“
2、状态模式的UML图学习

状态模式主要涉及以下几个角色:
(1)环境(Context):环境类是拥有状态的对象,它维护一个对抽象状态类的引用,通过该引用来切换当前状态。环境类在其操作中会委托给当前状态对象进行处理。
(2)抽象状态(State):抽象状态类定义了一个接口,用于封装环境对象的特定状态所对应的行为。
(3)具体状态(Concrete State):具体状态类实现了抽象状态类定义的接口,并根据具体情况进行相应的处理和状态转换。
通过这些角色的协作,状态模式可以实现对象的状态与行为之间的解耦,使得状态的变化不会影响到客户端代码,同时也方便了状态的扩展和维护。
3、状态模式的应用场景
(1)一个对象的行为取决于它的状态,并且需要在运行时根据状态改变行为时,可以考虑使用状态模式。
(2)当一个对象的行为在不同的状态下有不同的实现,且这些状态可以动态切换时,可以考虑使用状态模式。
(3)当需要消除大量的条件判断语句,并将其转换为状态类之间的关联时,可以考虑使用状态模式。
4、状态模式的优缺点
(1)优点
1)将状态转换逻辑封装在具体的状态类中,使得状态变化对于客户端来说是透明的,客户端无需关心状态的切换细节。
2)将大量的条件判断语句转换为状态类之间的关联,使得代码更加清晰、可读性更高。
3)符合开闭原则,当需要增加新的状态时,只需要添加新的状态类而不需要修改现有的代码。
简而言之:"是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来【DP】"
(2)缺点
1)状态模式会引入多个状态类,增加了系统的复杂性。
2)如果状态转换比较复杂,可能会导致状态类之间的相互调用增多,影响系统的性能。
5、C++实现状态模式的实例
#include <iostream>// 状态接口
class State
{
public:virtual void handle() = 0;
};// 具体状态类A
class ConcreteStateA : public State
{
public:void handle() override {std::cout << "Handle by ConcreteStateA" << std::endl;}
};// 具体状态类B
class ConcreteStateB : public State
{
public:void handle() override {std::cout << "Handle by ConcreteStateB" << std::endl;}
};// 上下文类
class Context
{
private:State* state;public:Context(State* initialState) : state(initialState) {}void setState(State* newState) {state = newState;}void request() {state->handle();}
};int main() {// 创建状态对象State* stateA = new ConcreteStateA();State* stateB = new ConcreteStateB();// 创建上下文对象并设置初始状态Context context(stateA);// 请求处理context.request(); // 输出: Handle by ConcreteStateA// 切换状态context.setState(stateB);context.request(); // 输出: Handle by ConcreteStateB// 释放资源delete stateA;delete stateB;return 0;
}
上述示例中,定义了一个状态接口State,具体状态类ConcreteStateA和ConcreteStateB实现了该接口。上下文类Context持有一个状态对象,并根据当前状态调用相应的行为。通过切换状态,可以改变上下文对象的行为。
相关文章:
(三)行为模式:8、状态模式(State Pattern)(C++示例)
目录 1、状态模式(State Pattern)含义 2、状态模式的UML图学习 3、状态模式的应用场景 4、状态模式的优缺点 (1)优点 (2)缺点 5、C实现状态模式的实例 1、状态模式(State Pattern&#x…...
nginx的配置文件概述及简单demo(二)
默认配置文件 当安装完nginx后,它的目录下通常有默认的配置文件 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connection…...
Apollo Planning2.0决策规划算法代码详细解析 (2): vscode gdb单步调试环境搭建
前言: apollo planning2.0 在新版本中在降低学习和二次开发成本上进行了一些重要的优化,重要的优化有接口优化、task插件化、配置参数改造等。 GNU symbolic debugger,简称「GDB 调试器」,是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端…...
flex 布局:元素/文字靠右
前言 略 使用flex的justify-content属性控制元素的摆放位置 靠右 <view class"more">展开更多<text class"iconfont20231007 icon-zhankai"></text></view>.more {display: flex;flex-direction: row;color: #636363;justify-co…...
java基础-第1章-走进java世界
一、计算机基础知识 常用的DOS命令 二、计算机语言介绍 三、Java语言概述 四、Java环境的搭建 JDK安装图解 环境变量的配置 配置环境变量意义 配置环境变量步骤 五、第一个Java程序 编写Java源程序 编译Java源文件 运行Java程序 六、Java语言运行机制 核心机制—Java虚拟机 核…...
jvm 堆内存 栈内存 大小设置
4种方式配置不同作用域的jvm的堆栈内存。 1、Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse根文件夹下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn16m //最小内存 -XX:PermSize=128M //非堆内…...
免杀对抗-反沙盒+反调试
反VT-沙盒检测-Go&Python 介绍: 近年来,各类恶意软件层出不穷,反病毒软件也更新了各种检测方案以提高检率。 其中比较有效的方案是动态沙箱检测技术,即通过在沙箱中运行程序并观察程序行为来判断程序是否为恶意程序。简单来说…...
QTimer类的使用方法
本文介绍QTimer类的使用方法。 1.单次触发 在某些情况下,定时器只运行一次,可使用单次触发方式。 QTimer *timer new QTimer(this); connect(timer, &QTimer::timeout, this, &MainWindow::timeout); timer->setSingleShot(true); timer-…...
(三)行为模式:9、空对象模式(Null Object Pattern)(C++示例)
目录 1、空对象模式(Null Object Pattern)含义 2、空对象模式的主要涉及以下几个角色 3、空对象模式的应用场景 4、空对象模式的优缺点 (1)优点 (2)缺点 5、C实现空对象模式的实例 1、空对象模式&am…...
Django实战项目-学习任务系统-用户登录
第一步:先创建一个Django应用程序框架代码 1,先创建一个Django项目 django-admin startproject mysite将创建一个目录,其布局如下:mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py 2,再创建一个…...
【动手学深度学习-Pytorch版】Transformer代码总结
本文是纯纯的撸代码讲解,没有任何Transformer的基础内容~ 是从0榨干Transformer代码系列,借用的是李沐老师上课时讲解的代码。 本文是根据每个模块的实现过程来进行讲解的。如果您想获取关于Transformer具体的实现细节(不含代码)可…...
做外贸独立站选Shopify还是WordPress?
现在确实会有很多新人想做独立站,毕竟跨境电商平台内卷严重,平台规则限制不断升级,脱离平台“绑架”布局独立站,才能获得更多流量、订单、塑造品牌价值。然而,在选择建立外贸独立站的过程中,选择适合的建站…...
echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{}才起作用,如果在series里写的不起作用就写到全局里
echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{show:true}才起作用,如果在series里写的不起作用就写到全局里 series里写tooltip不起作用,鼠标悬浮在echarts图表上时不显示提示 你需要…...
jmeter分布式压测
一、什么是压力测试? 压力测试(Stress Test),也称为强度测试、负载测试,属于性能测试的范畴。 压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行被测软件系统ÿ…...
consulmanage部署
一、部署consul 使用yum方式部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo yum -y install consul 执行以下命令获取uuid密钥并记录下来 uuidgen 编辑consul配置文件 vi /etc/consul.d/consul.h…...
大数据软件项目的验收流程
大数据软件项目的验收流程是确保项目交付符合预期需求和质量标准的关键步骤。以下是一般的大数据软件项目验收流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.项目验收计划制定: 在…...
《第一行代码Andorid》阅读笔记-第一章
这篇文章是我自己的《第一行代码Andorid》的阅读笔记,虽然大量参考了别人已经写好的一些笔记和代码但是也有自己的提炼和新的问题在里面,我也会放上参考文章链接。 学习重点 Android系统的四大组件: (1)活动ÿ…...
Educational Codeforces Round 146 (Rated for Div. 2)(VP)
写个题解 A. Coins void solve(){ll n, k; cin >> n >> k;bl ok true;if (n &1 && k %2 0) ok false;print(ok ? yes : no); } B. Long Legs void solve(){db x, y; cin >> x >> y;if (x < y) swap(x, y);int t1 ceil(sqrt(x))…...
9.30国庆
消息队列完成进程间通信 #include <myhead.h>#define size sizeof(msg_ds)-sizeof(long) //正文大小//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }msg_ds;//创建子线程构造体 void *task1(void *arg) {//创造第二个key值ke…...
java基础-第4章-面向对象(二)
一、static关键字 静态(static)可以修饰属性和方法。 称为静态属性(类属性)、静态方法(类方法)。 静态成员是全类所有对象共享的成员。 在全类中只有一份,不因创建多个对象而产生多份。 不必创…...
国际首都公报:湖北省放飞炬人国际控股集团国际总裁方达炬批准《湖北省放飞炬人国际控股集团国际军务涉军事法院规章》施行
国际首都公报:湖北省放飞炬人国际控股集团国际总裁方达炬批准《湖北省放飞炬人国际控股集团国际军务涉军事法院规章》施行...
终极指南:使用 crypto-js 测试套件确保你的加密功能100%可靠
终极指南:使用 crypto-js 测试套件确保你的加密功能100%可靠 【免费下载链接】crypto-js JavaScript library of crypto standards. 项目地址: https://gitcode.com/gh_mirrors/cr/crypto-js 在Web开发中,你有没有遇到过这样的场景:你…...
保姆级教程:STM32F103开发第一步,搞定Keil5安装、激活与芯片包(附资源包)
STM32F103开发环境搭建全指南:从Keil5安装到芯片包配置 引言:为什么选择Keil MDK进行STM32开发 对于刚接触STM32微控制器的新手来说,开发环境搭建往往是第一个"拦路虎"。Keil MDK(Microcontroller Development Kit&…...
猫抓插件:5分钟掌握浏览器视频下载终极指南
猫抓插件:5分钟掌握浏览器视频下载终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过想要保存网页视频却找不到下载按钮的烦恼?或者想收藏在线音乐却只…...
大数据领域Spark的集群监控与管理
大数据领域Spark的集群监控与管理:从工厂仪表盘到智能调度的故事 关键词:Spark集群、监控指标、资源管理、性能调优、监控工具链 摘要:在大数据时代,Spark作为分布式计算的"超级引擎",支撑着企业从海量数据中…...
避坑指南:rviz多点导航插件编译失败?可能是你的ROS版本或消息类型不匹配
避坑指南:rviz多点导航插件编译失败?可能是你的ROS版本或消息类型不匹配 当你满怀期待地从GitHub克隆了一个功能强大的rviz多点导航插件,准备为自己的机器人系统增添顺序导航能力时,却遭遇了令人沮丧的编译错误——这种经历对于RO…...
Piping Server开发者指南:如何基于流传输构建自己的应用
Piping Server开发者指南:如何基于流传输构建自己的应用 【免费下载链接】piping-server Infinitely transfer between every device over pure HTTP with pipes or browsers 项目地址: https://gitcode.com/gh_mirrors/pi/piping-server Piping Server是一个…...
终极Django CORS Headers缓存优化指南:如何正确配置Vary头部提升性能
终极Django CORS Headers缓存优化指南:如何正确配置Vary头部提升性能 【免费下载链接】django-cors-headers Django app for handling the server headers required for Cross-Origin Resource Sharing (CORS) 项目地址: https://gitcode.com/gh_mirrors/dj/djang…...
告别调参玄学:在GID遥感数据集上优化DeeplabV3+的5个实战技巧
告别调参玄学:在GID遥感数据集上优化DeeplabV3的5个实战技巧 遥感影像分割一直是计算机视觉领域的难点任务,尤其是面对GID这类包含复杂地物边界和多尺度目标的数据集时。许多研究者在初步跑通DeeplabV3模型后,往往会陷入mIoU指标停滞不前的困…...
nlp_structbert_sentence-similarity_chinese-large赋能智能客服:精准匹配用户问题与知识库
nlp_structbert_sentence-similarity_chinese-large赋能智能客服:精准匹配用户问题与知识库 你有没有遇到过这样的情况?在某个App里找客服,输入了一大段问题,结果机器人回复的答案要么是“牛头不对马嘴”,要么就是让你…...
