本文是设计模式golang实现系列:状态模式

概念

有限状态机(Finite State Machine):有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。有 3 个组成部分:状态(State)、事件(Event)、动作(Action),事件触发状态的转移及动作的执行。

状态模式:用来实现状态机的设计模式,常用在工作流引擎、工单等涉及到很多状态的场景。

作用

状态模式能解耦状态和状态转移(事件),让整个状态机系统逻辑能加清晰。

实现例子

超级玛丽

这里以儿时手柄游戏”超级玛丽“中的马里奥的状态作为例子来讲解。

假设马里奥的状态有4种:小马里奥(Small Mario)、超级马里奥(Super Mario)、超级火焰马里奥(Super Fire Mario)、游戏结束时的马里奥(Dead Mario)

假设游戏里会遇到的事件:

E1:吃蘑菇,加100分

E2:吃火焰花,加200分

E3:撞到怪物

几种状态转移如下图:

可以抽象一个状态接口如下:

每种状态,实现这个接口,如当马里奥为Small状态时,碰到三种事件时要做出的反应,对应的状态转移和动作(即额外逻辑,这个例子中为加分)是怎样的。

代码中的MarioStateMachine可以理解为状态机,里面含有成员变量IMarioState,状态机遇到什么事件做怎样的状态流转,即演示了上图状态转移的流程。

完整的代码如下:

状态的定义和实现代码

状态机代码

main函数测试

对应的输出为

参考链接