设计模式行为型——状态模式
目录
状态模式的定义
状态模式的实现
状态模式角色
状态模式类图
状态模式举例
状态模式代码实现
状态模式的特点
优点
缺点
使用场景
注意事项
实际应用
在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态就会发生改变,从而使其行为也发生改变。如天气都有晴天和雨天的时候,不同的天气有不同的行为,当然天气也会受影响其他影响变化。
状态模式的定义
状态模式(State Pattern)属于行为型设计模式,也叫作状态机模式(StateMachine Pattern),对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
状态模式中类的行为是由状态决定的,在不同的状态下有不同的行为。其意图是让一个对象在其内部改变的时候,行为也随之改变。状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。
在状态模式中,创建表示各种状态的对象和一个行为随着状态对象改变而改变的context对象。
状态模式的解决思想是:当控制一个对象状态转换的条件表达式过于复杂时,把相关“判断逻辑”提取出来,用各个不同的类进行表示,系统处于哪种情况,直接使用相应的状态类对象进行处理,这样能把原来复杂的逻辑判断简单化,消除了 if-else、switch-case 等冗余语句,代码更有层次性,并且具备良好的扩展力。
状态模式的实现
状态模式角色
- 环境类角色(Context):也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
- 抽象状态角色(State):定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
- 具体状态角色(Concrete State):实现抽象状态所对应的行为,每一个类封装了一个状态对应的行为,并且在需要的情况下进行状态切换。
状态模式类图

状态模式举例
打篮球的时候运动员可以有正常状态,不正常状态,和超常状态,现在就以我们打篮球时候投篮时候的状态来举例子。正常状态下运动员投十个球进五个球;不正常状态下运动员投十个球进一个球,和超常状态下运动员投十个球进十个球。此时投篮状态为抽象状态角色,运动员的三种投篮竞技状态为具体状态角色,而运动员为环境类角色。
状态模式代码实现
抽象状态角色
package com.common.demo.pattern.state;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象状态角色 投篮* @date 2023/08/07 20:56:20*/
public interface State {/*** 投篮*/void shot();
}
具体状态角色
package com.common.demo.pattern.state;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体状态角色 投篮正常* @date 2023/08/07 21:00:07*/
public class NormalState implements State{@Overridepublic void shot() {System.out.println("发挥正常,十中五");}
}
package com.common.demo.pattern.state;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体状态角色 投篮超常* @date 2023/08/07 21:00:44*/
public class SuperState implements State{@Overridepublic void shot() {System.out.println("发挥超长,十中十");}
}
package com.common.demo.pattern.state;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体状态角色 投篮不正常* @date 2023/08/07 20:57:46*/
public class UnnormalState implements State{@Overridepublic void shot() {System.out.println("投篮发挥失常,十中一");}
}
环境类角色
package com.common.demo.pattern.state;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 环境角色 运动员* @date 2023/08/07 21:01:45*/
public class Player {private State state = new NormalState();public void setState(State state) {this.state = state;}public void shot() {state.shot();}
}
测试类
package com.common.demo.pattern.state;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 状态模式测试类* @date 2023/08/07 21:02:30*/
public class StateTest {public static void main(String[] args) {Player player = new Player();player.shot();//正常下投篮player.setState(new UnnormalState());player.shot();//不正常下投篮player.setState(new SuperState());player.shot();//超常下投篮}
}
测试截图

状态模式的特点
优点
- 将状态相关的行为封装到具体状态类中:状态模式通过将不同状态的行为封装到具体状态类中,使得状态之间的转换和行为的变化清晰明确。
- 遵循开闭原则:新增状态时无需修改原有代码,只需要添加新的状态类和相应的转换逻辑。
- 简化了条件判断:状态模式避免了大量的条件判断语句,使得代码更加可读、可维护。
- 符合单一职责原则:将特定的状态及其行为都封装到单独的类中。
缺点
- 增加了类的数量:使用状态模式会增加多个具体状态类,导致类的数量增加。
- 可能造成状态转换的复杂性:如果状态之间的转换逻辑比较复杂,可能会导致状态转换的控制逻辑变得复杂难以维护。
- 状态模式对"开闭原则"的支持并不太好:对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
使用场景
- 当对象的行为取决于其内部状态,并且在运行时可以动态改变状态时,可以使用状态模式。
- 当对象有多个状态且每个状态对应的行为有所不同时,可以使用状态模式。
- 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时,可以使用状态模式。
注意事项
- 状态之间的转换关系要清晰:确保状态之间的转换关系清晰明确,避免状态转换的混乱和错误。
- 借助上下文对象管理状态:状态模式通常需要配合上下文对象来管理状态的转换和行为委托,确保状态的正确切换和行为的正确执行。
- 状态最好不要超过5个:在行为受到状态约束的时候,使用状态模式,且状态最好不要超过5个
实际应用
- 订单状态管理:订单的生命周期包含多个状态(待支付、已支付、已发货等),可以使用状态模式来管理订单状态的转换和相应的行为。
- 状态机:状态机是一种广泛应用于计算机编程中的模型。状态模式可以用于实现复杂的状态机逻辑。
- 游戏角色状态:游戏中的角色可以根据不同的状态进行不同的行为,状态模式可以用于管理角色的状态和行为。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)
相关文章:
设计模式行为型——状态模式
目录 状态模式的定义 状态模式的实现 状态模式角色 状态模式类图 状态模式举例 状态模式代码实现 状态模式的特点 优点 缺点 使用场景 注意事项 实际应用 在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,把这种对…...
ElastAlert通过飞书机器人发送报警通知
前言 公司采用ELK架构搜集业务系统的运行日志,以前开发人员只有在业务出现问题的时候,才会去kibana上进行日志搜索操作,每次都是被用户告知系统出问题了,这简直是被啪啪打脸~ 于是痛定思痛,决定主动出击,…...
恒温碗语音芯片,具备数码管驱动与温度传感算法,WT2003H-B012
近年来,随着科技的飞速发展,智能家居产品已然成为了现代生活的一部分,为人们的生活带来了更多的便利和舒适。在这个不断演进的领域中,恒温碗多功能语音芯片——WT2003H-B012成为众多厂商的首选,为智能家居领域注入了全…...
新能源汽车需要检测哪些项目
截至2022年底,中国新能源车保有量达1310万辆,其中纯电动汽车保有量1045万辆。为把好新能源汽车安全关,我国新能源汽车除了完善的强制性产品认证型式实验外,还建立了“车企-地方-国家”逐级上报的三级监管体系实行新能源汽车全生命…...
VR内容定制 | VR内容中控管理平台可以带来哪些价值?
随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,其中教育领域也不例外。通过VR技术,学生可以身临其境地参与到各种场景中,获得更加直观、生动的学习体验。为了让教师更好地进行VR教学的设计和管理,提高教…...
篇十八:状态模式:状态驱动的行为
篇十八:"状态模式:状态驱动的行为" 开始本篇文章之前先推荐一个好用的学习工具,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…...
你以为开题报告是在写作文?好写作AI告诉你,它其实是一次“决策”
在我教的论文写作科普课里,有一个场景反复上演。 一位研一的学生,抱着一沓打印出来的文献,站在讲台前,一脸认真地对我说:“老师,我的开题报告文献综述写了6000字,但导师说我是‘文献汇编’&…...
推送通知实现长连接与消息队列
推送通知在现代应用中扮演着至关重要的角色,无论是社交媒体的即时消息、电商平台的订单提醒,还是金融应用的交易通知,都离不开高效稳定的推送机制。而长连接与消息队列作为实现推送通知的两大核心技术,能够确保消息的实时性和可靠…...
Claude Opus 4.7 API 接入指南:最强模型实测与中转配置教程(2026)
上周 Anthropic 放出了 Claude Opus 4.7 的 API 权限,我第一时间冲进去测了。复杂推理和长上下文代码生成这两块,确实把我之前用的 Claude 4.6 按在地上摩擦。Claude Opus 4.7 是 Anthropic 2026 年发布的旗舰推理模型,接入方式兼容 OpenAI S…...
警惕AI全自动攻击!Claude Opus成功构建Chrome漏洞武器化链路
在 Anthropic 公司发布 Mythos 和 Project Glasswing 模型引发激烈争论之际,一位安全研究人员展示了前沿 AI 技术对网络安全的实际影响。该研究突破了理论警告的局限,成功利用 Claude Opus 构建出针对 Google Chrome 复杂 V8 JavaScript 引擎的完整漏洞利…...
【X-STILT模型第一期】X-STILT 模型概述
目录X-STILT 模型概述支持的观测平台与气体物种GitHub 仓库中的内置核心脚本/功能X-STILT 模型的下载安装一、 下载与安装模型 (Download and install model)二、 前置条件与数据准备 (Prerequisites)1. 依赖卫星观测的柱浓度模拟 (For SATELLITE-dependent column simulation)…...
PHP 8.3实操指南|3个必用新特性(json_validate+typed常量)
PHP 8.3实操指南|3个必用新特性(json_validatetyped常量) 本文全程不堆底层理论、不聊复杂原理,只聚焦PHP 8.3最常用、最实用的3个核心新特性——json_validate、typed常量、Override属性,每个特性都配纯PHP实操示例&a…...
PVZ Toolkit 终极指南:5分钟掌握植物大战僵尸最强修改器
PVZ Toolkit 终极指南:5分钟掌握植物大战僵尸最强修改器 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PVZ Toolkit 是一款专为经典游戏《植物大战僵尸》PC版设计的开源辅助工具&#…...
Linux FrameBuffer(三)- 实战解析:如何通过 fb_fix_screeninfo 与 fb_var_screeninfo 配置显示模式
1. 初识FrameBuffer:显示配置的基石 第一次接触Linux FrameBuffer时,我被它的简洁设计惊艳到了。这个位于/dev/fb*的设备节点,就像一扇直接通向显示硬件的窗口。在实际嵌入式项目中,我们经常需要在不依赖X Window等桌面环境的情况…...
智能车竞赛车模争议|老选手嘴替上线,主打一个人间清醒!
简 介: 《智能车竞赛老选手发声:自制车模争议应回归竞赛初心》针对智能车竞赛新组别车模自制引发的争议,一位往届选手犀利指出:部分自制车模选手因作品被成品车模超越而质疑规则不公平,实则是将个人理想凌驾于竞赛公平…...
TrollInstallerX终极指南:3分钟解锁iOS设备全新玩法
TrollInstallerX终极指南:3分钟解锁iOS设备全新玩法 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款革命性的iOS安装工具,…...
