有限状态机

概念

有限状态自动机(FSM:Finite State Machine),简称状态机。它是描述有限多个状态以及状态转移需要满足的条件和条件满足后触发的动作的数学模型。
状态机有四个要素:

  • 现态:当前所处的状态
  • 条件:又称为“事件”,当一个条件被满足,将触发一个动作或执行一次状态的转移
  • 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新的状态
  • 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了

因此,现态和条件是因,动作和次态是果。


状态机的表示方法-状态迁移图(STD)

状态迁移图是一种描述 系统的状态以及相互转化关系的 图形方式。下面是一个“工单”的例子:
1111 其中:

  • 状态框 - 用方框表示,包括“现态”和“次态”
  • 条件及迁移箭头 - 用剪头表示状态迁移的方向,并在该箭头上标注触发条件
  • 节点圆圈 - 当多个箭头指向一个状态时,可以用节点符号进行汇总
  • 动作框 - 用椭圆框表示
  • 附加条件判断框 - 用六角菱形框表示

状态机的表示方法-状态迁移表

状态迁移表:用表格的形式来表示状态之间的关系。下面是“工单”的例子的简化版:
2222


注意事项

初学者往往会把某个“程序动作”当作状态来处理,我们称之为“伪态”。另外一个比较致命的错误是,在划分状态时,漏掉一些状态,我们称之为“漏态”。“动作”和“状态”的区别是:“动作”是不稳定的,一旦执行完就结束了;“状态”是相对稳定的,如果没有外界条件的触发,那么状态会一直持续下去。


状态模式

状态模式允许一个对象在其内部状态发生改变时,改变其行为。
状态模式中的角色包括:

  • 环境角色(Context,也称为上下文):定义了客户端感兴趣的接口,并且在内部保存一个具体状态类的对象。这个具体状态类的对象给出了此环境对象的“现态”
  • 抽象状态角色(State):它是一个接口或抽象类。为所有的具体状态类定义公共的接口
  • 具体状态角色(ConcreteState):继承或实现抽象状态角色。每个具体状态类都实现了环境的一个状态所对应的行为

关于状态模式的具体细节,请点击这里


例子-“工单”处理

1)项目结构:
2222

2)说明:

  • 使用状态模式实现状态机,来控制状态的转移。核心思路是:客户端会调用环境对象提供给它的接口,而在环境对象中又会调用具体状态对象的方法,在具体状态对象的方法中,可以更新环境对象的状态,在更新状态的时候,也可以通知所有的具体观察者对象。因此,客户端的输入就是状态机中的条件具体状态对象环境对象的状态的修改,就是状态机中的状态转移;在更新环境对象状态的时候,所通知的观察者对象的更新方法,就是状态机中的动作
  • 使用观察者模式来完成动作的解耦

3)UML图
333333

4) 说明

  • WorkOrderSubject:抽象主题角色,实现了增加、删除和通知观察者的方法
  • WorkOrderState:抽象状态角色
  • IWorkOrderListener:抽象观察者角色
  • WorkOrderListenerImpl.*:具体观察者
  • WorkOrderStateImpl:具体状态角色
  • WorkOrder:扮演 观察者模式中的具体主题角色 + 状态模式中的上下文角色
    • changeState(WorkOrderState state):更新WorkOrder自身状态之后,会通知所有的具体观察者对象

5)点此下载源代码
java -jar workorder.jar


参考文档

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: