状态机模式

有限状态机   FSM(Finite State Machine)

状态机四要素
现态、条件、动作、次态

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

 

可以理解成是对行为逻辑的抽象,就好象人在生活中会做出各种行为,例如吃饭、睡觉等,这些所有我们都看作是“行为”的分支,由大脑决定每种行为具体是什么实施。在整个FSM架构中,其实与上面解释一致,首先有一个状态基类stateObject,里面有三个方法,分别是状态前、状态中、状态后。所有具体行为都要继承这个基类,在这三个方法中具体实现各种方法的逻辑。然后,需要一个stateManager(大脑)状态管理类来管理这些状态,特别注意的是里面changeState方法,他是状态跳转的关键。至于如果存储各种状态,你可以用list类 ,字典类等等。有限状态机是把一个对象的行为分解称为易于处理的“块”或状态。

 例如将人的行为抽象成3个,分别是吃饭、睡觉、上班。上班族,只有吃饭、睡觉、上班三种行为,我们把这三种行为放进我们的大脑,即stateManager。那我们从什么行为开始呢?(其实这里就是initState),随便挑一个,默认为睡觉。之前说过,每个行为都有三个状态(前、中、后),当我们进入睡觉行为时,首先进入的是睡觉前状态(该状态只执行一次),然后进入睡觉中,真正的逻辑是在这里执行的,它会不停检查什么时候睡醒了,符合条件后跳到其他状态,当要进行跳转时,还会执行一次睡觉后状态,其实前、后状态我理解成当要执行或结束某种行为时,你要额外做的事情。例如,睡觉前我要带个眼罩。(放到游戏开发里可以进行一些赋值操作,或者调用其他类的方法,例如一些特效)。因为它编程快速简单,易于调试,性能高,与人类思维相似从而便于梳理,灵活且容易修改

FSM的优点就是因为它编程快速简单,易于调试,性能高,与人类思维相似从而便于梳理,灵活且容易修改。

 

当状态机做好后,想利用它去实现状态切换的时候,就只需要关注状态本身和什么条件下它能切换到哪个状态,而不用去关心如何实现,也就是说你只需要绘制出状态迁移图,状态机就能帮你去实现。

一 状态迁移图

在事件驱动机制的程序中,对象的行为往往是根据对象当前的状态和所收到的事件,一起结合起来,决定要做出的反应执行动作,最后状态变为另一新状态

假设对象当前的状态 为1,在事件1产生/触发后,通过查找状态表,获得事件处理完状态变迁后状态2。变迁过程是由两部分组成。

1)状态1 –>事件1

2)事件1–>状态2



 

posted @ 2023-01-10 17:27  CastleWu  阅读(262)  评论(0编辑  收藏  举报