【算法】有限状态机FSM

本文详细介绍了有限状态机(FSM)的概念、特点和要素,包括状态的管理和转换。讨论了FSM的两种设计方法:switch case/if else和基于表结构的设计,以及通用FSM设计的思考,强调了状态机在处理复杂状态流程中的应用价值。
摘要由CSDN通过智能技术生成

目录

一、快速理解

1、有限状态机(FSM)

2、有限状态机的设计

二、详细说明

1、有限状态机FSM

1)FSM概念

2)FSM的3特点

3)FSM的4要素

4)FSM状态转换图

2、FSM的设计和实现

1)设计思路

2)两种实现方式

3、通用FSM的设计


一、快速理解

有限状态机(FSM)的设计与实现(一)

1、有限状态机(FSM)

有限状态机(FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。通常FSM包含几个要素:状态的管理、状态的监控、状态的触发、状态触发后引发的动作。

2、有限状态机的设计

本文主要阐述一下状态机的几种设计方法。

1:switch case/if else设计方法

curEvent = getEvent();
curState = getCurState();
switch(curState)
{
    case state1:
    {
        switch(curEvent )
        {
             TODO...
             setCurState();
             break; 
        }
        break;
    }
    ...
}

这种设计方法最简单,通过一大堆判断来处理,适合小规模的状态切换流程,但如果规模扩大难以扩展和维护。

2:基于表结构的状态机设计方法:建立相应的状态表和动作查询表,根据状态表、事件、动作表定位相应的动作处理函数,执行完成后再进行状态的切换。

一个通用的状态机处理模块的设计如下:

/*状态表注册*/
void FSM_Regist(FSM_T* pFsm,STATE_TABLE_S* pStateTable)
{
   pFsm->FsmTable =  pStateTable;
   return;
}
/*状态迁移*/
void FSM_MoveState(FSM_T* pFsm,int state)
{
   pFsm->curState = state;
   return;
}
/*事件处理*/
void FSM_EventHandle(FSM_T* pFsm,int event)
{
    ACT_TABLE_T* pActTable = NULL;
    ActFun eventActFun = NULL;
    /*获取当前状态动作表*/
    pActTable = FSM_getActTable(pFsm);
    /*获取当前动作函数*/
    for(int i=0;i<MAX_ACT_NUM;i++)
    {
        if(event == pActTable[i].event)
        {
            eventActFun = pActTable[i].eventActFun;
            break;
        }
    }
    /*动作执行*/
    if(eventActFun)
    {
        eventActFun(pFsm);
    }
}

假设我们的状态图如下:


相应的状态机设置如下:

/*状态1的动作表*/
ACT_TABLE_T state1ActTable[] = {
    {EVENT1,state1Event1Fun},
    {EVENT3,state1Event3Fun},
};
/*状态2的动作表*/
ACT_TABLE_T state2ActTable[] = {
    {EVENT2,state2Event2Fun},
};
/*状态表*/
STATE_TABLE_T FsmTable[] = {
    {STATE1,state1ActTable},
    {STATE2,state2ActTable},
};

int main(int argc, _TCHAR* argv[])
{
    FSM_T fsm;
    /*状态表注册*/
    FSM_Regist(&fsm,FsmTable);
    FSM_MoveState(&fsm,STATE1);
    FSM_EventHandle(&fsm,EVENT1);
    FSM_EventHandle(&fsm,EVENT2);
    return 0;
}
/*客户端提供的状态处理函数*/
void state1Event1Fun(void* pFsm)
{
    FSM_MoveState((FSM_T*)pFsm,STATE2);
    return;
}
void state1Event3Fun(void* pFsm)
{
    FSM_MoveState((FSM_T*)pFsm,STATE3);
    return;
}
void state2Event2Fun(void* pFsm)
{
    FSM_MoveState((FSM_T*)pFsm,STATE3);
    return;
}

通过设计一个通用的基于表结构的状态机模块,针对不同的状态图,我们只需要根据状态图得到其状态表结构,然后通过FSM_Regist注册,就可以方便的使用了状态机的功能了。这种机制便于我们添加新的状态流程,并且可以很好的进行分层状态机的设计。

二、详细说明

1、有限状态机FSM

现实问题

在平时的工作中,有时候我们会遇到需要处理诸多状态的情况,譬如订单状态,简单罗列就有12种状态

"0": "交易关闭",
"1": "待支付",
"2": "支付确认中",
"3": "支付中",
"4": "待收货",
"5": "交易成功", // 已签收
"-1": "交易关闭", // 订单已取消
"-2": "交易关闭,退款中",
"-3": "交易关闭,已退款",
"-4": "订单异常",
"-5": "退货退款中",
"-6": "已退货退款"

而且这些状态之间存在联系。比如待支付状态下一个可能是支付确认中,可能是交易关闭,也可能是交易成功。

如何处理这么多的状态以及之间的关系,我们需要一个状态管理的机制,来统一处理,这里就需要FSM.

1)FSM概念

FSM(finite-state machine):表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值