简单有限状态机(FSM)

// 简单有限状态机(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值