死亡是一座永恒的灯塔

0%

有限状态机是什么?

有限状态机是什么

有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。

简单说,它有三个特征:

  • 状态总数(state)是有限的。
  • 任一时刻,只处在一种状态之中。
  • 某种条件下,会从一种状态转变(transition)到另一种状态。

有限状态机的使用

  1. 引入有限状态机的js库
1
2

<script src='state-machine.js'></script>
  1. 有限状态机的基本结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

var fsm = new StateMachine({

init: 'solid',

transitions: [

{ name: 'melt', from: 'solid', to: 'liquid' },

{ name: 'freeze', from: 'liquid', to: 'solid' },

{ name: 'vaporize', from: 'liquid', to: 'gas' },

{ name: 'condense', from: 'gas', to: 'liquid' }

],

methods: {

onMelt: function() { console.log('I melted') },

onFreeze: function() { console.log('I froze') },

onVaporize: function() { console.log('I vaporized') },

onCondense: function() { console.log('I condensed') }

}

});

基本操作

生成实例以后,就可以随时查询当前状态。

1
2
3
4
5
6
7
8

* fsm.current :返回当前状态。

* fsm.is(s) :返回一个布尔值,表示状态s是否为当前状态。

* fsm.can(e) :返回一个布尔值,表示事件e是否能在当前状态触发。

* fsm.cannot(e) :返回一个布尔值,表示事件e是否不能在当前状态触发。

Javascript Finite State Machine允许为每个事件指定两个回调函数,以warn事件为例:

1
2
3
4

* onbeforewarn:在warn事件发生之前触发。

* onafterwarn(可简写成onwarn) :在warn事件发生之后触发。

同时,它也允许为每个状态指定两个回调函数,以green状态为例:

1
2
3
4

* onleavegreen :在离开green状态时触发。

* onentergreen(可简写成ongreen) :在进入green状态时触发。

假定warn事件使得状态从green变为yellow,上面四类回调函数的发生顺序如下:onbeforewarn → onleavegreen → onenteryellow → onafterwarn。

除了为每个事件和状态单独指定回调函数,还可以为所有的事件和状态指定通用的回调函数。

1
2
3
4
5
6
7
8

* onbeforeevent :任一事件发生之前触发。

* onleavestate :离开任一状态时触发。

* onenterstate :进入任一状态时触发。

* onafterevent :任一事件结束后触发。

编码实战

信号灯

坚持技术分享,您的支持将鼓励我继续创作!