状态机最简单的实现就是使用大量的switch case或者是if else,对不同的状态分别处理。

这样的代码比较直观,但是项目逐渐变大时就让人不爽了。

 

另外的一种实现方式是定义一个散列表,维护状态和实现。

例如,魔兽世界的开源代码就是使用了这种方式。维护了消息类型和回调函数指针的一个数组。

 

还有一种方式是设计模式中的状态模式。不过,是不是该计算一下,状态不断增加后,将会有多少个State的派生类。

 

最后一种使用宏定义实现的比较直观。

 

看来wtl的源码,我用宏写了一个类似的小例子。

虽然和传统意义上的状态机有些分别,(不是处理一个状态自动进入下一个状态)但是对于网络中接到一个数据包做相应的逻辑处理的程序已经够用了。

 

稍后,将实现能够自动切换状态的状态机。

其中,定义了一些数据类型,需要包含windows.h的头文件。

 

自动切换状态的状态机

 

状态机中还有一种情况时,有些状态依赖于其他的状态,或需要等待某一条件打到后才执行。

可以设计MESSAGE_CMD_HANDLER(Cmd1,Cmd2, HandleCmd1,TRUE)

或MESSAGE_CMD_HANDLER(Cmd1,Cmd2, HandleCmd1,FALSE)

来标识是否立即执行下一状态。

这个功能后续实现。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐