最近开发一个系统,要用到比较多的状态机,若像是以前那样,每个状态机都分开实现,过于麻烦。故简单设计了个简单的模型
上图所示是一个简单的状态机示意图。按照个人理解状态机的一般处理都是,在主循环中检查事件Event,若事件发生则进行动作Action,若没发生则执行状态处理StateAction。动作Action完成后一般会进行状态的迁移。所以按照面向对象的思想来说,可将其分为以下三个类:
- Fsm
- FsmState
- FsmEvent
1.1 Fsm
负责整个状态机的扫描
class Fsm
{
public:
public:
Fsm();
int register_state(FsmState *state);
void scan();
inline FsmState *get_cur_state() const { return cur_state; }
inline void start() { cur_state = *state_tab.begin(); }
private:
FsmState *cur_state;
vector<FsmState *> state_tab;
};
1.2 FsmState
检查发生的事件,并调用事件的动作。已经执行状态自身的处理
class FsmState
{
p