前提:因为最近打算学设计模式的状态模式,但不是很明白有限状态机和状态模式之间的关系,索性用C++实现了一个简单案例复习了一下FSM,如果有更好的实现方法,欢迎留言
有限状态机四大要素
- 现态:当前所处状态
- 次态:当条件满足后,即将转移的下一个状态
- 动作:当满足某个事件时执行的动作;动作执行完毕后可以转移到另一个状态或保持原有状态
- 条件:转移状态所需的条件,当满足条件时,会触发一个动作或进行状态转移
C++函数指针实现
案例:学生的日常生活。
- 学生的日常生活包含以下几个状态:起床、上学、吃午饭、做作业、睡觉;
- 每个状态之间进行转移需要执行相应的事件。
我分为以下几个步骤来实现:
- (1)绘制状态转移图
- (2)创建状态转移的FSMItem类
- 枚举:所有状态
State
、所有事件Event
; - 成员变量:现态
_curState
、事件_event
、次态_nextState
- 成员函数:动作函数
- 枚举:所有状态
- (3)创建有限状态机FSM类
- 成员变量:状态转移表
vector<FSMItem*> _fsmTable
- 成员函数:初始化状态转移表、状态转移、根据事件执行相应动作
- 成员变量:状态转移表
- (4)测试FSM
(1)绘制状态转移图
(2)FSMItem类
//FSM状态项
class FSMItem
{
friend class FSM;
private:
//动作函数
static void getUp()
{
cout << "student is getting up!" << endl;
}
static void go2School()
{
cout << "student is going to school!" << endl;
}
static void haveLunch()
{
cout << "student is having lunch!" << endl;
}
static void doHomework()
{
cout << "student is doing homework!" << endl;
}
static void sleeping()
{
cout << "student is sleeping!" << endl;
}
public:
//枚举所有状态
enum