状态机(有限状态自动机 FSM)介绍以及常用状态机种类对比

article/2025/9/29 17:41:46

目录

状态机概念 :

为什么需要状态机: 

使用场景

状态机四要素:

常见类型状态机:

Squirrel State Machine 

 Spring Statemachine


状态机概念 :

  • 概念 : 状态机是有限状态自动机(英语:finite-state machine,缩写:FSM)的简称,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
  • 概念 : 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件.
  • 例子 : 举个最简单的例子,人有三个状态:健康,感冒,康复中。触发的条件有淋雨(t1),吃药(t2),打针(t3),休息(t4)。所以状态机就是健康-(t4)->健康;健康-(t1)->感冒;感冒-(t3)->健康;感冒-(t2)->康复中;康复中-(t4)->健康,等等。就是这样状态在不同的条件下跳转到自己或不同状态的图。
  • 好处 : 应用FSM模型可以帮助对象生命周期的状态的顺序以及导致状态变化的事件进行管理。将状态和事件控制从不同的业务Service方法的if else中抽离出来

为什么需要状态机: 

有限状态机是一种对象行为建模工具,适用对象有一个明确并且复杂的生命流(一般而言三个以上状态),并且在状态变迁存在不同的触发条件以及处理行为。使用状态机来管理对象生命流的好处更多体现在代码的可维护性、可测试性上,明确的状态条件、原子的响应动作、事件驱动迁移目标状态,对于流程复杂易变的业务场景能大大减轻维护和测试的难度。

使用场景

在以下情况下,Project 是使用状态机的理想选择:

  • 应用程序或其结构的一部分可以表示为状态。
  • 您想将复杂的逻辑拆分为更小的可管理任务。
  • 应用程序已经遇到并发问题,即异步发生的事情。

如果出现以下情况,您已经在尝试实现状态机:

  • 使用布尔标志或枚举来模拟情况。
  • 具有仅对应用程序生命周期的某些部分有意义的变量。
  • 循环遍历 if/else 结构并检查是否设置了特定的标志或枚举,然后在标志和枚举的某些组合存在或不存在时做出进一步的例外处理。

状态机四要素:

状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

  1. 现态:是指当前所处的状态 例如当前用户下了个单  , 还没付款 , 那么现态就是待付款。
  2. 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移 , 例如一个订单用户付款这个动作 , 就是个事件 。
  3. 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态 , 例如 用户付完款  , 需要将订单状态改成待发货 , 该状态这个就是动作。
  4. 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了 , 代发货就是次态 ,  付款 -> 触发修改状态动作 ->  现态由 "待付款" -> "待发货"。

常见类型状态机:

Squirrel State Machine 

官方文档 : squirrel-foundation | Squirrel State Machinesquirrel-foundation provided an easy use, type safe and highly extensible state machine implementation for Java.http://hekailiang.github.io/squirrel/

 Spring Statemachine

官方文档 : Spring Statemachine - Reference Documentationhttps://docs.spring.io/autorepo/docs/spring-statemachine/1.0.0.M3/reference/htmlsingle/#sm-statecontext

SquirrelStateMachine & SpringStateMachine对比
状态机类型体量上手难易度
SquirrelStateMachine相较于spring statemachine,squirrel的实现更为轻量,设计域也很清晰,对应的文档以及测试用例也很丰富相较于spring statemachine,squirrel上手更容易
SpringStateMachineStateMachine实例的创建比较重 , 以单例方式线程不安全,使用工厂方式对于类似订单等场景StateMachineFactory缓存订单对应的状态机实例意义不大,并且transition的注解并不支持StateMachineFactory相较于squirrel , spring statemachine上手略难


http://chatgpt.dhexx.cn/article/6YYicxg2.shtml

相关文章

STM32状态机编程----什么是状态机?

万事万物都有其状态 什么是状态 状态是人或事物表现出来的形态。是指现实(或虚拟)事物处于生成、生存、发展、消亡时期或各转化临界点时的形态或事物态势。 通过上面那句话,我们知道了状态就是一个对象在不同情况下对应的各种形态 做产品的…

什么是状态机?一篇文章就够了

1 概述 状态机[1]一般指有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),是表示有限…

C语言_有限状态机(FSM)

C语言_有限状态机(Finite State Machine) 基本介绍 许多小型或复杂的应用程序都使用有限状态机 (FSM),C 语言中的有限状态机是嵌入式系统的流行设计模式之一,有限状态机使开发变得容易和顺利。 有很多设备使用事件基态&#xf…

Unity字体展示下载

Unity字体种类展示 这是字体包里面的图片,是不是很多种字体. 下载链接: https://download.csdn.net/download/qq_42603590/12001130 这是下载字体包的地方,很便宜.没有积分的可以留言,我发给你 有时候可能回复的不是很快(抱拳了) 喜欢的话点个赞,关注一下再走吧,谢谢

Unity 之 官网下载地址,方便各个版本的 Unity 安装包下载

Unity 之 官网下载地址,方便各个版本的 Unity 安装包下载 目录 Unity 之 官网下载地址,方便各个版本的 Unity 安装包下载 一、简单介绍 二、各个版本下载入口网址 一、简单介绍 在 Unity 的下载地址现在不是很好找,这里保存一下 Unity 各…

Unity入门之路0-Unity下载安装以及版本选择

文章目录 下载链接Unity Hub和Unity的关系UnityHub下载(Win)两者比较 Unity版本选择许可证问题 下载链接 一定不要百度或者去垃圾网站下载盗版网站 ,Unity是正版免费的,官方很关注使用者的感受,所以下载官网的就没问题。 https://unity.cn/re…

UnityHub下载缓存位置

一、下载Unity各版本的编辑器 C:\Users\XXX\AppData\Local\Temp\unityhub-xxx-xxx-xxx-xxx 我电脑是 C:\Users\Administrator\AppData\Local\Temp\unityhub-xxxx-xxxx 如果你不需要备份安装包,那么这个缓存的文件夹,就与你无关了,因为安装完…

使用UnityHub下载任意版本Unity

目录 方法一 使用链接方法二 官网下载(适用于2018.4.23及以上版本) unityHub上只能下载官方指定的版本,很多其他版本不能下载,下面介绍的是在unityHub下载任意版本的方法 方法一 使用链接 举例: 2019.2.11f1版本的unity----> unityhub://2019.2.11f1/5f859a4cfee5 格式 unit…

Unity给游戏对象贴图、从官网下载资源、导入导出

1、新建项目、在项目场景中创建几何对象并修改参数 在层级“”中创建一个立方体(3D对象),同理也创建一个球体 创建好的立方体会显示在场景视图中 (从场景视图或层级视图中)选中几何体,选择场景视图中竖排工…

unity下载网页所有图片

用unity的c#脚本批量下载网页上的所有图片 1、将网页的html保存到本地 在网页上鼠标右击另存为如下图所示 保存html文件 2、通过截取<img“”>获取图片存储的地址 经过两个步骤之后就可以开始着手敲代码了 代码 html下载的本地地址和要保存的图片地址 //保存在本地ht…

Unity下载方法(超详细)

一、进入官网&#xff0c;点击[下载Unity]&#xff0c;点击右上角的小人头像&#xff0c;点击[创建Unity ID](创建ID的方法你点进去按照它要求你的一步一步做就行啦)。 二、创建完Unity ID并登录(或已有Unity ID并登录)后&#xff0c;下拉网页&#xff0c;点击[下载Unity Hub]&…

Unity 改变下载资源商店中资源默认路径的方法

Unity 改变下载资源商店中资源默认路径的方法 Unity资源商店中免费资源可以被我们很好的使用&#xff0c;尤其对于暂时还不会自己设计资源的创作者。但是&#xff0c;unity默认是将资源商店的下载路径设置在了C:\Users\操作系统当前用户\AppData\Roaming\Unity\Asset Store-5.x…

Unity 各版本下载方法

开发Unity的&#xff0c;获取不同版本Unity版本和了解Unity最新动态很重要&#xff0c;现在更新迭代很频繁&#xff0c;在开发时&#xff0c;不论遇到项目升级&#xff0c;还是插件要求&#xff0c;还是老项目运行&#xff0c;总是在多个版本间切换。 是不是经常遇到&#xff0…

Unity3d_NGUI和UGUI的学习

由于之前刚入门的时候&#xff0c;应Unity3d整体发展的要求我们自学了UGUI(相对来说UGUI比NGUI做得更好一些&#xff0c;后面会有2者对比)&#xff0c;但是后来公司要求使用NGUI&#xff0c;所以我这边把之前学习UGUI&#xff08;不全&#xff0c;当时资源有限&#xff09;和NG…

NGUI与UGUI的区别及其优缺点

UIGUI与BGUI 的区别 首先说一下NGUI NGUI是严格遵循KISS原则并用C#编写的Unity&#xff08;适用于专业版和免费版&#xff09;插件&#xff0c;提供强大的UI系统和事件通知框架。其代码简洁&#xff0c;多数类少于200行代码。这意味着程序员可以很容易地扩展NGUI的功能或调节已…

NGUI的使用教程与实例

原文地址&#xff1a;http://www.tasharen.com/?page_id185 NGUI下载地址&#xff1a;点我传送 NGUI教程&#xff1a;步骤1-Scene 1.创建一个新的场景&#xff08;New Scene&#xff09;。 2.选择并删除场景里的MainCamera。 3.在NGUI菜单下选择Create a New UI&#xff0c…

Unity NGUI 插件 简介

文章目录 Unity NGUI一. NGUI基础1.1 导入NGUI插件1.2 基本UI资源1.3 制作UI图集1.4 制作UI字体1.5 UIRoot、UIPanel 和 UICamera 组件1.6 Depth (深度) 二. 核心组件2.1 UISprite (精灵)2.2 UILabel (标签)2.3 UITexture (纹理)2.4 UIButton (按钮)2.5 UISlider (进度条)2.6 U…

Unity3D种UGUI与NGUI的对比差别(2)

层级管理概念UGUI采用Hierarchy排序的方式&#xff0c;替代了NGUI中的Depth排序。更精准的说&#xff0c;NGUI的排序是通过Depth、Z值、RenderQueue共同影响的&#xff0c;整体规则过于复杂&#xff1b;而UGUI采用的排序比较简单&#xff0c;在Canvas内部元素采用Hierarchy方式…

NGUI插件] 收录最全的NGUI示例文档中文教程(更新版本3.0.5)

NGUI3.0.X官网示例中文讲解 本站NGUI各个版本插件下载地址 NGUI 2.7.0中文字体的使用 官方网站上的控件说明翻译: NGUI控件说明(中文) UIWidget NGUI控件说明(中文) UIRoot NGUI控件说明(中文) UIPanel NGUI控件说明(中文) UICamera NGUI控件说明(中文) UIStretch NGUI控件…

NGUI 3.5教程(一)安装NGUI 3.5.8

写在前面&#xff1a; 网上找的NGUI教程&#xff0c;都是基于2.x版本的。为了能配合教程学着做&#xff0c;我也是下载了各种NGUI 2.x版本。但是在导入的时候&#xff0c;或多或少都报错&#xff08;我用的Unity 的版本是4.3.2&#xff09;。无奈之下&#xff0c;只好下载了最…