状态机的实现 (三)

2014-11-24 02:46:54 · 作者: · 浏览: 5
//////////////////
void SetPreviousState(BaseState *s)
{
m_pPreviousState = s;
}
////////////////////////////////////////////////////////////////////
///@brief 更新状态
///
///@return 无返回值
////////////////////////////////////////////////////////////////////
void Update()const
{
if (m_pGlobalState)
{
m_pGlobalState->Execute(m_pOwner);
}

if (m_pCurrentState)
{
m_pCurrentState->Execute(m_pOwner);
}
}

////////////////////////////////////////////////////////////////////
///@brief 改变状态
///@param [in]s 要设置的状态
///@return 无返回值
////////////////////////////////////////////////////////////////////
void ChangeState(BaseState *pNewState)
{
//assert(PNewState && ":trying to change to a null state");

///保留前一个状态记录
m_pPreviousState = m_pCurrentState;
///调用现有状态的退出方法
m_pCurrentState->Exit(m_pOwner);
///改变到一个新状态
m_pCurrentState= pNewState;
///调用新状态的进入方法
m_pCurrentState->Enter(m_pOwner);
}
////////////////////////////////////////////////////////////////////
///@brief 改变到上一状态
///
///@return 无返回值
////////////////////////////////////////////////////////////////////
void RevertToPreviousState()
{
ChangeState(m_pPreviousState);
}
////////////////////////////////////////////////////////////////////
///@brief 查看当前状态
///
///@return BaseState*当前状态
////////////////////////////////////////////////////////////////////
BaseState* CurrentState() const
{
return m_pCurrentState;
}

////////////////////////////////////////////////////////////////////
///@brief 查看全局状态
///
///@return BaseState* 全局状态
////////////////////////////////////////////////////////////////////
BaseState* GlobalState() const
{
return m_pGlobalState;
}
////////////////////////////////////////////////////////////////////
///@brief 查看前一状态
///
///@return BaseState*前一状态
////////////////////////////////////////////////////////////////////
BaseState* PreviousState() const
{
return m_pPreviousState;
}
//class passed as a parameter.
bool isInState(const BaseState& st)const
{
return typeid(*m_pCurrentState) == typeid(st);
}
};


#endif // !BASESTATEMACHINE_H
这个是状态机的基类,使用的时候只需要在每个具体实例中申明一个状态机的类,然后完成自己的状态类的填写,即可完成一个高质量的状态机。注释很全有中文的也有英文的,有兴趣的童鞋可以讨论下这个设计是否合理。