工作上有个功能模块用到了类似状态机的东东,于是上网科普了一番。状态机是由一系列输入驱动,然后系统由其中一种状态转换为另一种状态并产生某种输出,这样子的一个系统叫做状态机。状态机分为两种,一种是输出只和系统状态有关,叫做摩尔状态机,另一种是输出和输入以及系统状态都相关,叫做米莉状态机。有关输入、状态和输出的关系,相对来说比较复杂,暂且不述。仅就举两个简单的例子说明啥是状态机。
一个控制台程序,从头到尾执行一遍,啥也不用管,这就不是状态机。一个控制台程序执行过程中会让你输入Yes或No,这就可以看作是最简单的状态机。当输入Yes时它转到了一种状态,可能是执行一部分代码,当输入No时它转到了另一种状态,可能是执行了另一部分代码或者干脆退出了,这也是一种状态,叫做终止状态。每一个状态机都会有一个起始状态和一个终止状态。Windows程序则是一个相对更复杂的状态机,会处理各种各样的界面输入,内部状态也是千头万绪。
如果能把一个业务逻辑简化成状态机,那就可以比较简单地处理,程序结构也比较清晰了。再举个例子,一个网络象棋游戏,对于每一个客户端来说都是一个状态机,它有等待、闲逛、入局、参观等状态,有加入、退出等动作(输入)当客户端处在等待状态时,另一个客户端对它执行了加入的动作,那么处于等待状态的客户端便转移到了入局的状态,其它以此类推,这样一处理,逻辑上便清晰了很多。