有限状态机(FSM)
1、 什么是“状态”
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed 。
状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。例如,根据自动门的运行规则,我们可以抽象出下面这么一个图。
自动门有两个状态,open 和 closed ,closed 状态下,如果读取开门信号,那么状态就会切换为 open 。open 状态下如果读取关门信号,状态就会切换为 closed 。
状态机的全称是有限状态自动机,自动两个字也是包含重要含义的。给定一个状态机,同时给定它的当前状态以及输入,那么输出状态时可以明确的运算出来的。例如对于自动门,给定初始状态 closed ,给定输入“开门”,那么下一个状态时可以运算出来的。
这样状态机的基本定义我们就介绍完毕了。重复一下:状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。
四大概念
下面来给出状态机的四大概念。
第一个是 State ,状态
。一个状态机至少要包含两个状态。例如上面自动门的例子,有 open 和 closed 两个状态。第二个是 Event ,事件
。事件就是执行某个操作的触发条件或者口令。对于自动门,“按下开门按钮”就是一个事件。第三个是 Action ,动作
。事件发生以后要执行动作。例如事件是“按开门按钮”,动作是“开门”。编程的时候,一个 Action一般就对应一个函数。第四个是 Transition ,变换
。也就是从一个状态变化为另一个状态。例如“开门过程”就是一个变换。
2、什么是状态机?
- 有限状态机(Finite-state machine,FSM),又称有限状态自动机,简称状态机,是表示
有限个状态以及在这些状态之间的转移和动作等行为的数学模型
。 - FSM是一种算法思想,简单而言,有限状态机由一组状态、一个初始状态、输入和根据输入及现有状态转换为下一个状态的转换函数组成。
- 其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。
做需求时,需要了解以下六种元素:起始、终止、现态、次态(目标状态)、动作、条件,我们就可以完成一个状态机图了:
3、状态机图怎么画?
参考
提要知识点
做需求时,需要了解以下六种元素:起始、终止、现态、次态(目标状态)、动作、条件,我们就可以完成一个状态机图了:
-
①现态:是指当前所处的状态。
-
②条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
-
③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
-
④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
注意事项
1、避免把某个“程序动作”当作是一种“状态”来处理。那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
2、状态划分时漏掉一些状态,导致跳转逻辑不完整。所以在设计状态机时,我们需要反复的查看设计的状态图或者状态表,最终达到一种牢不可破的设计方案。
状态机表怎么画?
首先我们看下下面这张状态机图,展示了一张简单的单审批人文件的状态流转情况。
那么如何把他写成表呢?这里有多种写法,区别于纵坐标的不同,我们举两种:
左侧的纵坐标为初始状态,横坐标为终止状态。
右侧的纵坐标为动作条件,横坐标为终止状态。
那么对于动作比较多且复杂的情况下,可以考虑采用右侧的表格,这样会比较一目了然。
参考
1、https://zhuanlan.zhihu.com/p/47434856
2、https://blog.csdn.net/xinghuanmeiying/article/details/81586954
3、https://blog.csdn.net/u010107248/article/details/84730111