本篇内容介绍了“C++怎么实现一个有限状态机”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
什么是有限状态机?
简单说就是作一件事可能会经过多个不同状态的转换, 转换依赖于在不同时间发生的不同事件来触发, 举个例子,比如 TCP的状态转换图, 在实现上就可以用FSM.
传统的实现方案
if...else : 搞一大堆if else, 一个函数写很长很长......
swich...case : 也搞一大堆一个函数写很长很长......
FSM的实现方案
根据具体的业务需要, 将业务的处理流程定义为一个状态机, 此状态机中存在以下必要元素
根据业务需要, 拆解抽象出若干个不同状态 State, 并确定此状态机的初始状态;
根据实现需要, 抽象出用于触发状态转换的事件 Event;
为了处理一个Event, 需要定义状态的转换过程Transition;
状态机要先判断当前所处的状态是否与当前发生的Event匹配(注意: 相同的状态可能同时匹配多个Event)。
用张简图来说明一下
MachineSet可以同时管理多个Machine;
外部触发的Event进入到MachineSet的事件队列;
事件队列里的Event被顺序处理, 被Dispatch到match的Machine;
Machine根据当前的所处的state和Event类型来判断当前Event是否有效;
如果上面(4)中的Event有效, 则进行状态转换;
状态转换具体来说涉及到三个回调函数:
6.1 当前state离开, 是第一个回调,需要使用者根据实际需要处理;
6.2 trasition这个转换过程, 是第二个回调;
6.3 新state的进入, 是第三个回调;
一个简单的状态机,差不多就是上面这些内容, 剩下的就是用程序语言把它实现出来了;
FSM的C++ 实现
一个用C++11实现的FSM的代码
https://github.com/DavidLiuXh/kuafu
实现简介:
主要就是按deamo里的思路, 封装了以下几个模块
MachineSet,
Machine,
Event,
Transition,
Predicate
对于Event的处理, 提供两种方案:
直接使用MachineSet提供的StartBackground, 开启一个work thread, 在这个work thread中不断从存储event的fifo队列中获取event后dispatch到各个machine;
不使用MachineSet提供的event fifo, 实现自己的MachineSetHandler, 将其实例注册到MachineSet, 从event的派发;
一个具体的实现
我们来使用上面的FSM的实现来模拟一个用户登陆的场景;
定义用到的Event和几种不同的事件类型
定义用到的状态机, 从 kuafu::StateMachine 继承, 其中包括用过的几种state和transition
在Birth()函数中构造 state和 transition, Birth()是StateMachine的一个虚函数, 每个用户实现的Machine都需要实现它:
创建MachineSet, 并开始event处理线程
创建用户定义的Machine, 设置初始状态
设置state和transition相应的回调
模拟event发生:
“C++怎么实现一个有限状态机”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。