一个状态机的实现之路 没写过状态机还没看过状态机飞?带资深小白围观状态机的实现过程

 

通常来讲,状态机的实现有别人家的状态机,还有自己家的状态机!今天要分享的是同事家的状态机!状态机可以理解为维护对象行为,流转对象状态的代码组织方式!状态机能做的事情,普通的代码写法也能达到,使用状态机,更多考虑后期的可维护性!真的是好维护么?好维护的前提是理解状态机的实现​!状态机的实现是有很多种,这里仅介绍工作中同事实现的一个结果,与自己的理解​。采用大话状态机的​形式展开!

在荒岛上,有只企鹅(后续简称为QE),这只QE有三种状态,开心状态、休眠状态、满血状态,要达到开心状态,则要打豆豆,要达到休眠状态,则要睡觉,要达到满血状态,则要​吃饭。开心状态的时候,可以通过睡觉,转化为休眠状态。满血状态的时候,即可以通过睡觉,转化为休眠状态,也可以​通过打豆豆,转化为开心状态。

从状态机的角度来看这只QE的生活状态,就是吃饭、睡觉​、打豆豆。不同的行为会让这只QE进入不同的状态。

这只QE深信开心的时候不能吃饭,不然会被咽死,所以开心状态不能通过吃饭这个动作转化为满血状态​。睡觉的时候,不能吃饭、不能打豆豆,所以有了上面这个调整后的状态机​图示。图示解密了状态机的以下特征:

  1. 进入某个状态,是要执行相应的个动作。目前来看,一个抵达特定状态,要执行一个特定的动作。
  2. 状态之间可以存在转化关系​。有单向、多向的转化存在,视QE的信仰​而定。
  3. 单一​职责。每个状态处理器,包括了状态变化的所有动作,但是,其中一个动作是对应转化为当前状态所需做的​动作。比如QE的开心状态处理器,打豆豆是转化为开心状态所需做的动作。吃饭虽然也在开心状态处理器中,但是QE不会这么干!标黑,意味着,开心状态下不会去做吃饭这个动作,纵使QE有这个动作​。睡觉也在QE开心状态处理器,但是开心状态处理器,只管开心相关的动作,遇到睡觉,则将动作转到​休眠状态处理器。

采用状态机的方式来看QE的生活,用状态机代码模拟EQ生活的时候,可以很好的应对QE文化的变迁。状态之间的转化调整也很好实现。比如QE突然发现,开心时吃饭并不会被咽死,于是,QE生活状态机​发生了小小的变化。

开心状态处理器只需要将吃饭这个动作转交给满血状态处理器,执行吃饭,即可满足一次文化大变迁。如果QE有新的状态新的动作出现,比如说清醒状态,相应的动作为起床,那么,所有的状态处理器,都需要补上缺失的起床动作。

状态之间的变化在于QE生活的习惯,QE的世界没有睡懒觉的习惯,所以清醒状态下,不能又​接着睡觉。但是清醒状态下,可以吃饭、可以打豆豆。

故事讲到这里,大概了解到了QE生活状态机的​来龙去脉了。采用状态机描述QE状态变化,能较好的适应变化​。每个状态处理器遵循了单一职责,易于​维护与扩展。如何采用Java代码实现这样一个状态机​呢?关注公众号,且​听下回分解!

技术岛公众号

技术岛公众号

 

此条目发表在未分类分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注