有限状态自动机(Finite State Machine,FSM)简称状态机。它是描述有限多个状态以及状态转移需要满足的条件和条件满足后触发的动作的数学模型。
状态机有四要素:
现态:当前所处状态
条件:又称为“事件”,当条件满足时,将触发动作或执行状态的转移
动作:条件满足后执行的动作。动作执行完成后,可以迁移到新状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新状态
次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,将转变成新的“现态”
因此,现态和条件是因,动作和次态是果。
状态迁移图是一种描述系统的状态以及相互转化关系的图形方式。下面是一个“工单”示例:
其中:
状态框 - 用方框表示,包括“现态”和“次态”
条件及迁移箭头 - 用剪头表示状态迁移的方向,在该箭头上标注触发条件
节点圆圈 - 当多个箭头指向一个状态时,可以用节点符号进行汇总
动作框 - 用椭圆框表示
附加条件判断框 - 用六角菱形框表示
状态迁移表用表格的形式表示状态之间的关系。下面是“工单”的示例的简化版:
初学者往往将“程序动作”当作状态来处理,称之为“伪态”。另一个比较致命的错误是,在划分状态时,漏掉一些状态,称之为“漏态”。“动作”和“状态”的区别是,“动作”是不稳定的,执行完成即结束;“状态”是相对稳定的,如果没有外界条件触发,那么状态将一直持续下去。
状态模式允许对象在其内部状态发生改变时,改变其行为。状态模式中的角色包括:
环境角色(Context,也称为上下文):定义客户端感兴趣的接口,并且在内部保存具体状态类的对象。该对象给出此环境对象的“现态”
抽象状态角色(State):接口或抽象类。为所有的具体状态类定义公共接口
具体状态角色(ConcreteState):继承或实现抽象状态角色。每个具体状态类都实现环境的一个状态对应的行为