// 简单有限状态机(FSM)
// 有限状态自动机是一个五元组:
// 状态的非空有穷集合,输入字母表,状态转移函数,初始状态,终止状态集合
// 复杂的状态机构造,可以使用 boost StateChart 库
// VC2008
// 一个实际使用的状态机, 它的状态可能不能用一个类似整数这样的简单数据表示,并同时具有内部状态
// 则我们需要用一组对象的来表示这些状态, 并用一个指向他们的指针来表示"当前状态"
// 通常,在较高的层次,我们仍然可以用一个整数来表示"当前状态",并用一个对应的对象来记录这个状态的细节数据
// 参考《设计模式》(GoF)的"状态模式(State)"
#include "stdafx.h"
// 状态
enum enState
{
enState_Open,
enState_Close,
};
// 输入事件
enum enEvent
{
enEvent_Open,
enEvent_Close,
};
// 状态转换信息
struct tagStateChange
{
enState m_newState;
};
class FSM
{
public:
// 初始状态
FSM(enState s0) : m_State(s0) {};
// 状态转移函数: 事件处理函数
bool HandleEvent(enEvent enE)
{
tagStateChange cE;
switch(enE)
{
case enEvent_Open:
cE.m_newState = enState_Open;
break;
case enEvent_Close:
cE.m_newState = enState_Close;
break;
}
return ChangeState(cE);
}
// 状态转移函数: 状态转换函数
bool ChangeState(const tagStateChange& changeInfo)
{
if(m_State == changeInfo.m_newState)
return false;
m_State = changeInfo.m_newState;
return true;
}
// 终止状态
bool IsFinal() const
{
return (m_State == enState_Close);
}
private:
enState m_State;
};
int _tmain(int argc, _TCHAR* argv[])
{
FSM fsm(enState_Open); // 初始状态
fsm.HandleEvent(enEvent_Open);
fsm.HandleEvent(enEvent_Close);
fsm.HandleEvent(enEvent_Open);
fsm.HandleEvent(enEvent_Open);
fsm.HandleEvent(enEvent_Close);
bool bClose = fsm.IsFinal();
return 0;
}