FSM和STATE模式

 

三种状态(ABC)三种操作(ONOFFACK

 

ON(0)

OFF(1)

ACK(2)

A(0)

A

B

C

B(1)

B(未定义)

A

C

C(2)

C(未定义)

C(未定义)

B

其中ABC三种状态和ON OFF ACK三种转化操作,下面代码给出了STATE模式的基本实现过程,一般而言,状态机的设计分为两大部分,FSM中包含所有状态转化的操作,FSMstate是所有状态的基类,该类中包含所有的状态迁移操作,其子类实现了不同的状态迁移,通过多态可以实现相同的操作实施在不同状态时转化。

#include<iostream>

 

using namespace std;

 

class FSMstate

{

public:

         virtual void on() { cout<<"undefined combo"<<endl; }

         virtual void off() { cout<<"undefined combo"<<endl; }

         virtual void ack() { cout<<"undefined combo"<<endl; }

};

 

class FSM

{

public:

         FSM();

         void on()

         {

                   states[current]->on();

                   current = next[current][0];

         }

         void off()

         {

                   states[current]->off();

                   current = next[current][1];

         }

         void ack()

         {

                   states[current]->ack();

                   current = next[current][2];

         }

private:

         FSMstate* states[3];

         int current;

         int next[3][3];

};

 

class A : public FSMstate

{

public:

         void on() { cout<<"A, on ==> A"<<endl; }

         void off() { cout<<"A, off ==> B"<<endl; }

         void ack() { cout<<"A, ack ==> C"<<endl; }

};

 

class B : public FSMstate

{

public:

         void off() { cout<<"B, off ==> A"<<endl; }

         void ack() { cout<<"B, ack ==> C"<<endl; }

};

 

class C : public FSMstate

{

         void ack() { cout<<"C, ack ==> B"<<endl; }

};

 

FSM::FSM()

{

//三种状态

         states[0] = new A;

         states[1] = new B;

         states[2] = new C;

//当前状态

         current = 1;

//描述状态转换的数组

         next[0][0] = 0; next[0][1] = 1; next[0][2] = 2;

         next[1][0] = 1; next[1][1] = 0; next[1][2] = 2;

         next[2][0] = 2; next[2][1] = 2; next[2][2] = 1;

}

 

enum Message { On, Off, Ack };

Message  messageArray[10] = { On,Off,Off,Ack,Ack,Ack,Ack,On,Off,Off };

 

void main()

{

         FSM fsm;

         for( int i = 0; i < 10; i++ )

         {

                   if( messageArray[i] == On ) fsm.on();

                   else if( messageArray[i] == Off ) fsm.off();

                   else if( messageArray[i] == Ack ) fsm.ack();

         }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值