其实我们在编程时实现相关业务逻辑时经常需要处理各种事件和状态切换,写各种switch/case 和if/else ,所以我们其实可能一直都在跟有限状态机打交道,只是可能没有意识到。在处理一些业务逻辑比较复杂的需求时,可以先看看是否适合用一个有限状态机来描述,如果可以把业务模型抽象成一个有限状态机,那么代码就会逻辑特别清晰,结构特别规整。
下面我们就来聊聊所谓的状态机,以及它如何在代码中实现。
1、状态机的要素
状态(State):表示对象的某种形态,在当前形态下可能会拥有不同的行为和属性。
转移(Transition):表示状态变更,并且必须满足确使转移发生的条件来执行。
动作(Action):表示在给定时刻要进行的活动。
事件(Event):事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。
所有的状态转换都可以概括为:F(S, E) -> (A, S’),即如果当前状态为S,接收到一个事件E,则执行动作A,同时状态转换为下个状态S’。
- F(S) -> (A, S’) 型状态机:下一状态只由当前状态决定
- F(S, E) -> (A, S’) 型状态机:下一状态不但与当前状态有关,还与当前输入值有关
2、状态表的要素
现态:是指当前所处的状态。
条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
我们以视频转码过程(基于业务模型的猜想)用状态表表示整个过程,如下图所示。
现态|次态 | 文件上传 | 转码模板 | 视频转码 | 保存视频 |
文件上传 | N/A |
N/A |
N/A |