通常来讲,状态机的实现有别人家的状态机,还有自己家的状态机!今天要分享的是同事家的状态机!状态机可以理解为维护对象行为,流转对象状态的代码组织方式!状态机能做的事情,普通的代码写法也能达到,使用状态机,更多考虑后期的可维护性!真的是好维护么?好维护的前提是理解状态机的实现!状态机的实现是有很多种,这里仅介绍工作中同事实现的一个结果,与自己的理解。采用大话状态机的形式展开!
在荒岛上,有只企鹅(后续简称为QE),这只QE有三种状态,开心状态、休眠状态、满血状态,要达到开心状态,则要打豆豆,要达到休眠状态,则要睡觉,要达到满血状态,则要吃饭。开心状态的时候,可以通过睡觉,转化为休眠状态。满血状态的时候,即可以通过睡觉,转化为休眠状态,也可以通过打豆豆,转化为开心状态。
从状态机的角度来看这只QE的生活状态,就是吃饭、睡觉、打豆豆。不同的行为会让这只QE进入不同的状态。
这只QE深信开心的时候不能吃饭,不然会被咽死,所以开心状态不能通过吃饭这个动作转化为满血状态。睡觉的时候,不能吃饭、不能打豆豆,所以有了上面这个调整后的状态机图示。图示解密了状态机的以下特征:
- 进入某个状态,是要执行相应的个动作。目前来看,一个抵达特定状态,要执行一个特定的动作。
- 状态之间可以存在转化关系。有单向、多向的转化存在,视QE的信仰而定。
- 单一职责。每个状态处理器,包括了状态变化的所有动作,但是,其中一个动作是对应转化为当前状态所需做的动作。比如QE的开心状态处理器,打豆豆是转化为开心状态所需做的动作。吃饭虽然也在开心状态处理器中,但是QE不会这么干!标黑,意味着,开心状态下不会去做吃饭这个动作,纵使QE有这个动作。睡觉也在QE开心状态处理器,但是开心状态处理器,只管开心相关的动作,遇到睡觉,则将动作转到休眠状态处理器。
采用状态机的方式来看QE的生活,用状态机代码模拟EQ生活的时候,可以很好的应对QE文化的变迁。状态之间的转化调整也很好实现。比如QE突然发现,开心时吃饭并不会被咽死,于是,QE生活状态机发生了小小的变化。
开心状态处理器只需要将吃饭这个动作转交给满血状态处理器,执行吃饭,即可满足一次文化大变迁。如果QE有新的状态新的动作出现,比如说清醒状态,相应的动作为起床,那么,所有的状态处理器,都需要补上缺失的起床动作。
状态之间的变化在于QE生活的习惯,QE的世界没有睡懒觉的习惯,所以清醒状态下,不能又接着睡觉。但是清醒状态下,可以吃饭、可以打豆豆。
故事讲到这里,大概了解到了QE生活状态机的来龙去脉了。采用状态机描述QE状态变化,能较好的适应变化。每个状态处理器遵循了单一职责,易于维护与扩展。如何采用Java代码实现这样一个状态机呢?关注公众号,且听下回分解!