篇十八:状态模式:状态驱动的行为
篇十八:"状态模式:状态驱动的行为"
开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。
另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d
设计模式是软件开发中的重要知识,状态模式(State Pattern)是一种行为型设计模式,用于通过将对象的状态抽象为独立的类,并根据状态的变化来改变对象的行为。本文将介绍状态模式的原理和优势,并提供C++实现状态模式的示例代码。
1. 状态模式的原理:
状态模式是一种通过将对象的状态抽象为独立的类来实现状态驱动的行为的设计模式。它包含以下核心角色:
- 环境(Context):持有状态对象,并将行为委托给当前状态对象处理。
- 抽象状态(Abstract State):定义了状态的接口,用于处理环境的请求,并可能导致状态的转换。
- 具体状态(Concrete State):实现了抽象状态的接口,处理环境的请求,并可能改变环境的状态。
状态模式的关键是通过将状态抽象为独立的类来分离状态行为的实现,从而使得环境类的代码更加简洁和可维护。
2. 状态模式的优势:
状态模式具有以下优势:
- 状态驱动的行为:状态模式能够根据对象的状态来改变其行为,从而使得对象的行为与其状态相对应,提高了代码的清晰度和可读性。
- 状态复用:状态模式将状态抽象为独立的类,使得不同的对象可以共享相同的状态,从而提高了状态的复用性。
- 状态扩展:通过添加新的状态类,可以方便地扩展对象的状态和行为,而不需要修改环境类的代码,符合开闭原则。
3. 在C++中应用状态模式:
以下是状态模式的C++示例代码:
a. 定义抽象状态类:
// State.h
class Context; // 前向声明class State {
public:virtual ~State() {}virtual void handle(Context* context) = 0;
};
b. 定义具体状态类:
// ConcreteStateA.h
#include <iostream>
#include "State.h"
#include "Context.h"class ConcreteStateA : public State {
public:void handle(Context* context) override {std::cout << "ConcreteStateA handles the request." << std::endl;context->setState(new ConcreteStateB());}
};// ConcreteStateB.h
#include <iostream>
#include "State.h"
#include "Context.h"class ConcreteStateB : public State {
public:void handle(Context* context) override {std::cout << "ConcreteStateB handles the request." << std::endl;context->setState(new ConcreteStateA());}
};
c. 定义环境类:
// Context.h
#include "State.h"class Context {
public:Context(State* initialState) : state_(initialState) {}void setState(State* newState) {delete state_; // 释放旧状态state_ = newState;}void request() {state_->handle(this);}private:State* state_;
};
d. 客户端使用:
// main.cpp
#include "ConcreteStateA.h"
#include "Context.h"int main() {State* initialState = new ConcreteStateA();Context context(initialState);// 状态A处理请求,然后转换到状态Bcontext.request();// 状态B处理请求,然后转换到状态Acontext.request();return 0;
}
4. 状态模式的代码解析:
在状态模式中,通过将状态抽象为独立的类,将状态的行为和状态的转换与环境类解耦,使得环境类的代码更加简洁和可维护。通过切换不同的状态对象,可以改变对象的行为,实现状态驱动的行为。
5. 最佳实践:
在使用状态模式时,需要注意以下几点:
- 合理设计状态类:状态类需要封装状态的行为,并负责处理状态的转换逻辑,从而保持状态类的简洁和一致性。
- 状态对象生命周期管理:在环境类中,需要负责管理状态对象的生命周期,确保在切换状态时正确释放旧状态。
6. 总结:
状态模式是一种重要的设计模式,它通过将状态抽象为独立的类来实现状态驱动的行为。在C++中,我们可以通过抽象状态类和具体状态类来实现状态模式。状态模式在状态驱动的应用场景中非常有用,能够提高代码的清晰度和可维护性。
希望本文能够帮助您理解状态模式的原理和优势,并通过C++的示例代码演示了如何在C++中应用状态模式来实现状态驱动的行为。设计模式是软件开发中的重要知识,掌握不同的设计模式有助于提高代码质量、可维护性和可扩展性。
参考文献:
- Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
- C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/
相关文章:
篇十八:状态模式:状态驱动的行为
篇十八:"状态模式:状态驱动的行为" 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料&…...
【Tomcat】(Tomcat 下载Tomcat 启动Tomcat 简单部署 基于Tomcat进行网站后端开发)
文章目录 Tomcat下载Tomcat启动Tomcat简单部署 基于Tomcat进行网站后端开发 Tomcat Tomcat 是一个 HTTP 服务器.HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. HTTP 服务器我们可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实现的一个开源免费,也是…...
简单动态字符串 sds
Redis 设计了简单动态字符串(Simple Dynamic String,SDS)的结构,用来表示 字符串。相比于 C 语言中的字符串实现,SDS 这种字符串的实现方式,会提升字符串的操 作效率,并且可以用来保存二进制数据…...
“深入剖析JVM内部原理:解密Java虚拟机的奥秘“
标题:深入剖析JVM内部原理:解密Java虚拟机的奥秘 摘要:本文将深入探讨Java虚拟机(JVM)的内部原理,包括其架构、内存管理、垃圾回收机制、即时编译器等关键组成部分。通过解密JVM的奥秘,我们将更…...
使用QT纯代码创建(查找)对话框详细步骤与代码
一、创建项目文件 打开Qt Creator->文件->新建文件或项目->选择Qt Widgets Application 为项目起名字 输入类的名字 二、 了解每个文件的作用 项目创建完毕之后就会出现以下几个文件,先来分别介绍以下这些文件的作用。 Headers->finddialog.h——很显…...
4945: 二进制转十进制
4945: 二进制转十进制 时间限制: 1.000 Sec 内存限制: 128 MB 提交: 520 解决: 335 [命题人:][下载数据: 30] 提交状态报告 题目描述 将二进制数转成十进制输出 输入 一行,一个二进制数,二进制数的位数小于32位。 输出 一个十进制的整数。…...
java后端技术汇总 + 中间件 + 架构思想
1. 华为OD机考题 答案 2023华为OD统一考试(AB卷)题库清单-带答案(持续更新) 2023年华为OD真题机考题库大全-带答案(持续更新) 2. 面试题 一手真实java面试题:2023年各大公司java面试真题汇总--…...
《机器学习系统:设计与实现》读书笔记一
最近几年一直在做算法工程的工作,对机器学习系统有所涉猎,也很感兴趣。近期发现一本开源书籍《机器学习系统:设计与实现》。去图书馆找了它的纸质版,发现内容不尽相同。在这里结合两者做一个读书笔记。本文是第一篇,主…...
C语言单链表OJ题(较难)
一、链表分割 牛客网链接 题目描述: 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 思路:…...
工业巡检ar沉浸式互动培训体验实现更加直观、生动的流程展示
以往的工业手工巡检效率极低,错误率偏高,漏检问题严重,会因为现场人员对机械设备的早期维护、操作不会,而影响正常交付和服务,智慧工业是工业智能化和信息化的重要体现,在巡检方面自然也要同步提升…...
【Spring】核心容器——依赖自动装配
Spring容器根据bean所依赖的资源在容器中自动查找并注入bean的过程叫做自动装配自动装配的方式 1、按类型 2、按名称(耦合性较高) 3、按构造方法 自动装配特点 1、自动装配用于对引用类型进行依赖注入,不能对简单类型进行操作 2、自动装配的…...
TestNG和Junit5测试框架梳理
一、testNG 1. testNG优势 注解驱动: TestNG 使用注解来标识测试方法、测试类和配置方法,使得测试更具可读性。 并行执行: TestNG 支持多线程并行执行测试,可以加速测试套件的执行。 丰富的配置: 可以通过 XML 配置文…...
算法练习Day46|139.单词拆分
LeetCode:139.单词拆分 139. 单词拆分 - 力扣(LeetCode) 1.思路 字符串是否能被字符串列表中的元素拼接出来,显然是一个背包问题,而且需要排列。 将字典转换为HashSet,利用.contains()方法判断是否存在元素与背包中的子串相同…...
Maven工程的安装配置及搭建(集成eclipse完成案例,保姆级教学)
目录 一.下载及安装及环境配置 1.下载及安装 2.环境变量的配置 3.检测是否安装成功 4.配置Maven 1.更换本地仓库 2. 配置镜像 二.集成eclipse完成案例 1.eclipse前期配置Maven 2.创建Maven工程 一.下载及安装及环境配置 1.下载及安装 下载地址:Maven – Down…...
82 | Python可视化篇 —— Plotly数据可视化
文章目录 什么是 Plotly安装 Plotly创建散点图创建线图创建条形图创建饼图创建热力图3D图(3D Plot)直方图(Histogram)3D表面图(3D Surface Plot)箱线图(Box Plot)散点地图(Scatter Map)量级地图(Choropleth Map)在网页中嵌入 Plotly 图表总结什么是 Plotly Plotly…...
Golang 包详解以及go mod
Golang 中包的介绍和定义 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案,Go 语言为我们提供了 很多内置包,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。 Golang 中的包可以分为三种:1、系统内置包 2、自定义包 3、第三方包…...
中级课程-SSRF(CSRF进阶)
文章目录 成因危害挖掘 成因 危害 挖掘...
C++命名空间
目录 格式 使用 命名空间的嵌套 使用 using声明 命名空间里面包含了逻辑结构上相互关联的一组类、函数、模板等。命名空间像是一个容器,把某些在逻辑结构上相关的 “ 对象 ” 放在一起并与外界区分。特别的,命名空间里的变量名或类名可以和命名空间外…...
阿里云服务器搭建Magento电子商务网站图文教程
本文阿里云百科分享使用阿里云服务器手动搭建Magento电子商务网站全流程,Magento是一款开源电商网站框架,其丰富的模块化架构体系及拓展功能可为大中型站点提供解决方案。Magento使用PHP开发,支持版本范围从PHP 5.6到PHP 7.1,并使…...
Docker安装 Kibana
目录 前言安装Kibana步骤1:准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2:拉取 kibana 镜像拉取镜像查看已拉取的镜像 步骤3:创建容器创建容器方式1:快速创建容器 步骤…...
跨境远程办公新体验!拖拽传文件让跨国协作丝滑不卡顿
跨境打工人集合!常年跨国协作、异地对接还总被远程办公难题绊住脚遇上跨国网络延迟高,操控卡顿半天没反应想远程协助同事,传大文件限速又麻烦,几百兆素材要等半小时,简直太影响效率了!别愁!跨境…...
在国产化ARM平台(如鲲鹏)上,用Eclipse搞定JavaFX开发的避坑指南
在国产化ARM平台(如鲲鹏)上构建JavaFX开发环境的全流程指南 当国产化替代浪潮遇上ARM架构的崛起,开发者们正面临一个全新的技术挑战:如何在华为鲲鹏等国产ARM服务器上搭建高效的JavaFX开发环境?与传统的x86平台不同&am…...
“隐形鼠标“引发的电脑重装闹剧
欢迎来到新一周的"都是我的锅"专栏。这是《The Register》的读者投稿栏目,专门收录大家在工作中搞砸事情、又想方设法收拾残局的真实故事。本周的主角是一位读者,我们姑且叫他"Steve"。他给我们发来了一段简短有趣的经历,…...
2025届必备的AI辅助写作平台实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术写作跟内容创作的领域当中,降重网站已然变成了规避文本重复率过高这一问题…...
别再手动抄数据了!用NI-VISA和C语言自动读取仪器数据的保姆级教程
从零构建自动化仪器数据采集系统:NI-VISA与C语言实战指南 实验室里,你盯着示波器屏幕上跳动的波形,手指在计算器和笔记本键盘间来回切换——这场景是否熟悉?数据采集本是科研与工程的核心环节,却因手动记录的低效成为许…...
大数据开发中常见的排序算法
大数据处理中,排序算法需兼顾效率与可扩展性。 主流方案包括: 1)Timsort作为混合排序算法,适应Spark等分布式场景; 2)外部排序通过分片归并解决内存限制; 3)基数排序适合固定长度数据; 4)BitonicSort专为并…...
Qwen3-VL-8B本地部署实测:4090显卡5分钟搞定,开箱即用
Qwen3-VL-8B本地部署实测:4090显卡5分钟搞定,开箱即用 1. 为什么选择Qwen3-VL-8B? 在当今多模态AI领域,Qwen3-VL-8B以其卓越的视觉语言理解能力和高效的本地部署方案脱颖而出。作为一款专为消费级GPU优化的多模态模型࿰…...
告别ArcGIS手动操作:用Python脚本批量处理MCD12Q2植被物候数据(附完整代码)
用Python全自动处理MODIS物候数据:从HDF到生长季分析的完整解决方案 在植被物候研究中,MCD12Q2数据集因其高时间分辨率和全球覆盖能力成为不可替代的数据源。但面对动辄数十GB的HDF文件,传统ArcGIS点选操作不仅效率低下,更难以应对…...
别再死记硬背Attention公式了!用Python+PyTorch手撕一个Hierarchical Attention Network(HAN)
从零实现层次注意力网络:用PyTorch构建可解释的文本分析模型 在自然语言处理领域,理解长文档的层次结构一直是个挑战。传统的注意力机制虽然强大,但面对嵌套的文本层级(如词→句→段落)时往往力不从心。这就是Hierarch…...
从随机数据到平滑曲线:用PCHIP算法在MATLAB中玩转数据插值(保姆级教程)
从随机数据到平滑曲线:用PCHIP算法在MATLAB中玩转数据插值(保姆级教程) 刚接触数据分析时,最让人头疼的莫过于拿到一组杂乱无章的实验数据,却要呈现出一条专业、平滑的曲线。记得我第一次处理传感器采集的振动数据时&a…...
