有限状态自动机(一个简单例子面向对象实现)

即状态+动作==》下一个状态+动作
并再其中处理该过程的函数中,改变状态和做出响应
以上门禁闸机模型:
闸机有两个状态:lock,unlock
每个状态有两个动作:card(刷卡),pass(试图通过)
进一步分析:
lock+card:闸机状态==.unlock
lock+pass:警告,不能通过
unlock+card:感谢(已经刷卡,可以通过)
unlock+pass:通过之后,闸机状态==》lock
#include <iostream>
using namespace std;
typedef struct _machine machine;
typedef struct _machine_state machine_state;
machine_state *lock,*unlock;
//状态类:有两个动作
typedef struct _machine_state{
void (*card)(machine *M);
void (*pass)(machine *M);
}machine_state;
//机器
typedef struct _machine
{
void use_card(){printf("use card:");this->ms->card(this);}
void try_pass(){printf("try pass:");this->ms->pass(this);}
machine_state *ms;
}machine;
//以下定义四个 状态+动作==》下一个状态+动作
void locked_card(machine *M)//state=lock,action=card
{
M->ms=unlock;
printf("open\n");
}
void locked_pass(machine *M)
{
printf("alarm:you cant pass");
/* 执行 alarm 动作,调用 alarm 函数 */
}
void unlocked_card(machine *M)
{
printf("thank you!");
/* 执行 thank you 动作,调用 thank you 函数 */
}
void unlocked_pass(machine *M)
{
M->ms=lock;
printf("you have went through!");
/* 状态切换至锁闭状态 */
/* 执行 lock 动作,调用 lock 函数 */
}
machine_state locked = {locked_card, locked_pass};
machine_state unlocked = {unlocked_card, unlocked_pass};
int main(){
machine *M=new machine();
lock=&locked;
unlock=&unlocked;
M->ms=lock;
int event;
while(1){
scanf("%d",&event);
switch(event){
case 0:
M->use_card();
break;
case 1:
M->try_pass();
break;
default:
exit(0);
}
}
return 0;
}
1
try pass:alarm:you cant pass
0
use card:open
0
use card:thank you!
0
use card:thank you!
1
try pass:you have went through!