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

在这里插入图片描述

即状态+动作==》下一个状态+动作
并再其中处理该过程的函数中,改变状态和做出响应

以上门禁闸机模型:
闸机有两个状态: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!