定义
有限状态机(Finite-state machine)是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。[1]
特征
简单说,它有三个特征[2]:
- 状态总数(state)是有限的。
- 任一时刻,只处在一种状态之中。
- 某种条件下,会从一种状态转变(transition)到另一种状态。
几个重要概念[3]
- 状态(State):表示对象的某种形态,在当前形态下可能会拥有不同的行为和属性。
- 转移(Transition):表示状态变更,并且必须满足确使转移发生的条件来执行。
- 动作(Action):表示在给定时刻要进行的活动。
- 事件(Event):事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。
状态机的要素[1:1]
状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
- 现态:当前所处的状态。
- 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
- 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
- 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
我们可以用状态表了表示整个过程,如下图所示。
状态表
注意的问题
避免把某个“程序动作”当作是一种“状态”来处理[1:2]
那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
例子
游戏
有限状态机用来编游戏和故事是最好的了。[4]
这有一个寻宝游戏,首先你从‘开始’出发,然后你跟随箭头知道你到达终点。
褒扬和批判
游戏开发
在游戏开发中使用状态机显然不失为一种不错的选择,首先它的概念并不复杂,其次它的实现也十分简单而直接。但它的缺点却也十分明显,例如难以复用,因为它往往需要根据具体的情况来做出反应,当然当状态机的模型复杂到一定的程度之后,也会带来实现和维护上的困难。[3:1]
更多
参考:[5]
代码相关:[2:1]
对JavaScript的意义在于,很多对象可以写成有限状态机。