Java中状态机

状态机介绍

状态机(State Machine)是一种数学模型,用于描述对象或系统在不同状态之间的转移和行为。它由一组状态、转移条件和动作组成,可以根据输入条件从一个状态转移到另一个状态,并执行相应的动作。

特点:

  1. 离散性:状态机是离散的,它的状态和转移是离散的,不涉及连续变化。
  2. 易于理解和建模:状态机可以直观地描述对象或系统的行为,使得人们能够更好地理解和建模复杂的逻辑。
  3. 可扩展性:状态机可以轻松地添加新的状态和转移,以适应需求的变化。
  4. 灵活性:状态机可以根据输入条件自动转移状态,并执行相应的动作,具有较高的灵活性和自动化能力。

使用场景:

  1. 控制流程管理:状态机可以用于控制流程中的状态转移,例如工作流程管理、订单状态管理等。
  2. 设备控制:状态机可以用于描述设备的状态和状态转移,例如自动售货机、电梯控制等。
  3. 游戏开发:状态机可以用于游戏中的角色状态管理,例如角色的移动、攻击、防御等状态。
  4. 自动化系统:状态机可以用于自动化系统中的控制和决策,例如智能家居系统、工业自动化等。

总之,状态机是一种强大的工具,在一些较复杂的场景下可以帮助我们描述和管理对象或系统的状态和行为,提高代码的可理解性、可扩展性和灵活性。

状态机实现

一般情况下,都是使用状态模式:可以使用状态模式来实现状态机,将每个状态封装成一个类,通过状态之间的转换来实现状态机的功能,有点类似于策略模式。

状态机中一般包含状态(state)以及行为(handle),通过行为改变状态,并且此行为的结果是已知的。

案例:假设需要开发一套流程,其中,

状态:待处理、处理中、已处理、已评价。

行为:创建、分配、领取、流转、跟进、办结、评价。

具体的状态流转是:

行为前置状态后置状态
创建待处理
分配待处理处理中
领取待处理处理中
流转处理中处理中
跟进处理中处理中
办结处理中已处理
评价已处理已评价

其实,从上面表格中也可以看出,行为和状态之间必然的联系,换成模型的话,可以用一个二维数组来表示,一维数组下标表示行为,二位数组下标表示前置状态,数组中的值表示后置状态。

使用表格表示:

创建分配领取流转跟进办结评价
待处理×处理中处理中××××
处理中×××处理中处理中已处理×
已处理××××××已评价
已评价×××××××

具体代码实现:

public enum StatusEnum {PENDING("待处理"),PROCESSING("处理中"),PROCESSED("已处理"),EVALUATED("已评价");private String name;StatusEnum(String name) {this.name = name;}public String getName() {return name;}
}
public enum ActionEnum {CREATE("创建"),ASSIGN("分配"),RECEIVE("领取"),TRANSFER("流转"),FOLLOW_UP("跟进"),FINISH("办结"),EVALUATE("评价");private String name;ActionEnum(String name) {this.name = name;}public String getName() {return name;}
}
/*** 状态机*/
public class StateMachine {private static final StatusEnum[][] transitions = {{null,StatusEnum.PROCESSING,StatusEnum.PROCESSING,null,null,null,null},{null,null,null,StatusEnum.PROCESSING,StatusEnum.PROCESSING,StatusEnum.PROCESSED,null},{null,null,null,null,null,null,StatusEnum.EVALUATED},{null,null,null,null,null,null,null}};public StatusEnum handle(StatusEnum status, ActionEnum action) {int statusIndex = status.ordinal();int actionIndex = action.ordinal();StatusEnum nextStatus = transitions[statusIndex][actionIndex];if (nextStatus == null) {throw new IllegalStateException("no valid action");}return nextStatus;}
}

测试代码:

public class StateMachineTest {public static void main(String[] args) {StateMachine stateMachine = new StateMachine();// 当前状态待处理,操作是分配,得出下一步状态是处理中System.out.println(stateMachine.handle(StatusEnum.PENDING, ActionEnum.ASSIGN));// 当前状态已处理,操作是分配,为null,即操作不当System.out.println(stateMachine.handle(StatusEnum.PROCESSED, ActionEnum.ASSIGN));}
}

测试结果:

PROCESSING
Exception in thread "main" java.lang.IllegalStateException: no valid actionat com.honor.wpshowdemo.serverone.example.StateMachine.handle(StateMachine.java:17)at com.honor.wpshowdemo.serverone.example.StateMachineTest.main(StateMachineTest.java:11)

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

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

相关文章

2022 ICPC 济南 E Identical Parity (扩欧)

2022 ICPC 济南 E. Identical Parity (扩欧) Problem - E - Codeforces 大意:给出一个 n 和一个 k , 问是否能构造一个长 n 的排列使得所有长 k 的连续子序列和的奇偶性相同。 思路:通过分析可知 , 任两个间隔 k - 1 的元素奇偶…

PCB电路板电压电流监测软件

PCB电路板电流监测软件详细设计说明书是一个详细描述软件系统设计和实现的文档,它提供了软件系统的架构、功能模块、接口设计、数据存储和处理、界面设计、数据库设计、系统测试、部署和维护计划等方面的详细信息。模拟量采集/老化房采集软件 该文档的目的是为了确保…

ssm+vue理发店会员管理系统源码和论文

ssmvue理发店会员管理系统源码和论文089 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用&a…

【从零开始学习JAVA | 第四十六篇】处理请求参数

前言: 在我们之前的学习中,我们已经基本学习完了JAVA的基础内容,从今天开始我们就逐渐进入到JAVA的时间,在这一大篇章,我们将对前后端有一个基本的认识,并要学习如何成为一名合格的后端工程师。今天我们介绍…

机器学习基础15-模型保存

结果部署是机器学习项目中的最后一步,也是最重要的步骤之一。选 定算法之后,对算法训练生成模型,并部署到生产环境上,以便利用机器学习解决实际问题。模型生成之后,也需要定期对模型进行更新,使模型处于最新…

ssm+vue线上体验馆管理系统源码和论文

ssmvue线上体验馆管理系统源码和论文085 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储&#xff0…

python web GUI框架-NiceGUI 教程(一)

python web GUI框架-NiceGUI 教程(一) streamlit可以在一些简单的场景下仍然推荐使用,但是streamlit实在不灵活,受限于它的核心机制,NiceGUI是一个灵活的web框架,可以做web网站也可以打包成独立的exe。 基…

hdfs操作

hadoop fs [generic options] [-appendToFile … ] [-cat [-ignoreCrc] …] [-checksum …] [-chgrp [-R] GROUP PATH…] [-chmod [-R] <MODE[,MODE]… | OCTALMODE> PATH…] [-chown [-R] [OWNER][:[GROUP]] PATH…] [-copyFromLocal [-f] [-p] [-l] [-d] … ] [-copyTo…

电子价签如何让电信门店数字化事半功倍?

数字化转型&#xff0c;高效的工具首先跟上。早在2020年&#xff0c;深圳电信就与云里物里开展商业合作&#xff0c;在深圳所有电信营业厅安装云里物里的ESL电子标签&#xff0c;以替代传统纸质标签的显示。经过几年的效果认证&#xff0c;云里物里的数字化智显设备得到了深圳电…

Web3.0时代什么时候到来,Web3.0有什么机会?

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

什么是亚马逊类目核心关键词?

亚马逊类目核心关键词是指在亚马逊平台上&#xff0c;与特定产品类别相关且具有较高搜索量和竞争度的关键词。这些关键词在产品标题、描述、属性和搜索关键字等位置使用&#xff0c;有助于提高产品的曝光度和搜索排名&#xff0c;并吸引潜在买家的注意。选择适当的核心关键词可…

Flink Kubernates Native - 入门

创建 namespace [rootCentOSA flink-1.17.1]# kubectl create ns flink-native [rootCentOSA flink-1.17.1]# kubectl config set-context --current --namespaceflink-native命令空间添加资源限制 [rootCentOSA flink-1.17.1]# vim namespace-ResourceQuota.yamlapiVersion:…

IDEA的maven想显示层级关系,而非平级

新版和旧版的IDEA的位置不一样&#xff0c;2023.2.1的版本在右上角的“” 这个位置 如图所示&#xff1a; 然后点击按模块分组&#xff1a;

在项目中快速搭建机器学习的流程

在软件开发领域&#xff0c;机器学习框架发挥着关键作用&#xff0c;为开发人员提供强大的人工智能工具、库和算法&#xff0c;以有效地利用机器学习的潜力。从本质上讲&#xff0c;机器学习使计算机能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。 机器学习框…

腾讯云服务器配置CPU内存怎么选?带宽多大合适?

腾讯云服务器配置如何选择&#xff1f;CPU内存、带宽和系统盘怎么选择合适&#xff1f;个人用户可以选择轻量应用服务器&#xff0c;企业用户可以选择云服务器CVM&#xff0c;2核2G3M带宽轻量服务器95元一年、2核4G5M服务器168元一年&#xff0c;企业用户可以选择标准型S5云服务…

Java 大厂面试 —— 常见集合篇 List HashMap 红黑树

23Java面试专题 八股文面试全套真题&#xff08;含大厂高频面试真题&#xff09;多线程_软工菜鸡的博客-CSDN博客 常见集合篇-01-集合面试题-课程介绍 02-算法复杂度分析 2 List相关面试题 2.1 数组 2.1.1 数组概述 数组&#xff08;Array&#xff09;是一种用连续的内存空…

Visual Studio中Linux开发头文件intellisense问题的解决办法

文章目录 前言个人环境 SSH到WSL复制文件后记 前言 最近在用我心爱的Visual Studio配合WSL2做一些Linux开发&#xff0c;但是有一个问题&#xff0c;就是当我#include <sys/socket.h>&#xff0c;会提示找不到文件 我尝试了各种姿势&#xff0c;包括修改CMakeSettings.…

与面试官互动:建立积极的技术讨论氛围

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

在 AWS 中导入 qcow2 镜像

文章目录 在 AWS 中导入 qcow2 镜像使用的格式和问题步骤概述前提条件转换镜像格式并上传至 S3创建角色并配置策略策略文件内容创建container.json配置文件导入镜像创建 AMI 并启动实例参考:在 AWS 中导入 qcow2 镜像 当我们在多云环境中部署应用时,有时候可能需要把基于 qem…

C语言学习笔记(完整版)

文章目录 算法算法的基本概念算法的特征算法的优劣 描述算法三种基本结构流程图N-S流程图伪代码 常量和变量了解数据类型常量整形常量实型常量字符型常量转义字符符号常量 变量整形变量实型变量字符型变量 表达式与运算符赋值运算符和赋值表达式变量赋初值强制类型转换 算术运算…