状态机编程 (二) 标准状态机实现

状态机的典型实现方法:

嵌套的switch语句
状态表
面向对象的状态设计模式
枚举状态和事件
将状态和事件进行枚举:

enum sm_state
{
    state1,
    state2,
    state3
}
enum sm_event
{
    event1,
    event2,
    event3
}
 

嵌套的switch语句实现状态机
嵌套的switch可以用一维状态表来表现:

当前状态    事件    监护条件    下一状态    动作
state1    event1    check是否符合规则    event2    action1
event2    check是否符合规则    event3    action2
event3    check是否符合规则    event4    action3
state2    event1    check是否符合规则    event5    action4
event2    check是否符合规则    event6    action5
event3    check是否符合规则    event7    action6
state3    event1    check是否符合规则    event8    action7
event2    check是否符合规则    event9    action8
event3    check是否符合规则    event1    action9
第一层switch为state, 第二次switch为event:

void state_machine_process(int state, int event)
{
    switch(state)
    {
        case state1:
        {
            switch(event)
 
                case event1:
 
                case event2:
 
                case event3:
        }
        case state2:
        {
            switch(event)
 
                case event1:
 
                case event2:
 
                case event3:
        }
    }    
}
缺点:

不促进代码复用;
随着状态和事件的增多,状态机容易变得非常长;
非层次式。
数组查表实现状态机
使用一个2维状态表,在水平方向罗列事件,在竖直方向罗列状态。

event1    event2    event3
state1    action1    action2    action3
state2    action4    action5    action6
state3    action7    action8    action9
可使用二维函数指针数组将其表现,数组成员为state和event下的处理函数指针:

typedef void (*SM_FUN) (int, int);
 
SM_FUN state_machine[3][3]
{
    {
        {(SM_FUN)action1},
        {(SM_FUN)action2},
        {(SM_FUN)action3}
    },
    {
        {(SM_FUN)action4},
        {(SM_FUN)action5},
        {(SM_FUN)action6}
    },
    {
        {(SM_FUN)action7},
        {(SM_FUN)action8},
        {(SM_FUN)action9}
    }
}
当使用时,可以根据当前的state和event进行查表,选择对应的处理函数:

*state_machine[state2][evnet2](state2, event2);
————————————————
版权声明:本文为CSDN博主「Chen_Hulk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010034085/article/details/119303695

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
购买提醒:全程代码实战,本系列课程建议有Java开发经验2年以上的学员观看和购买。录制本套教程的初衷,通过从业10年接触过很多的技术开发人员,尤其在面试一些技术人员的时候,发现他们的技术知识更新较慢,很多人渴望接触到高并发系统和一些高级技术架构,为了帮助更多人能够提升自己和接触到这类技术架构,并满足企业的人才需求,利用业余时间我开始录制这套教程。通过录制教程有很多学员给我反馈信息,给了我很大的鼓舞,当然也有吐槽,我想说的是技术是没有边界的,脱离一线业务场景去谈技术,都是耍流氓的。如对我录制的教程内容有建议请及时交流。本套课程历经1年时间研发,案例来源于真实业务场景抽离,由从业10年企业一线架构师实录,没有基础不建议购买。购买后提供企业级多方位指导,通过本套案例可以让你学习目前主流的微服务技术架构和多种企业级高并发和海量数据、高可用、分布式、支付、多语言、前后端分离等技术的综合应用解决方案。在开始本课程前给大家科普几个概念: 高并发是指在比较短的时间内有大量的访问者访问目标系统,系统负载饱和或者过载宕机。 高并发的应用,我们应该都有用过或者见过,比如天猫、京东、拼多多、亚马逊的秒杀抢购还有12306的抢票。我们在体验应用的时候,可能并不会像到这种高并发系统背后的技术实现难度。高并发系统都存在这几种问题,高并发读、高并发写、访问高峰突发性、反馈结果的即时性。在抢购的时候,尤其是抢购火车票的时候,我们经常会疯狂的刷库存,几亿用户产生非常大的高并发读; 通过以上的科普相信大家对课程有一个基本的认知了,本套教程以应用最为广泛的电商系统为标本,给大家构建一个亿级微服务秒杀系统,让大家跟着我的步骤能学习行为背后的原理。本课程采用全新的微服务架构,运用了很多工业界企业解决方案和高级技术,带大家手把手实现一个高性能,高并发,高可用等的亿级微服务秒杀系统,本课程会包含很多高级的内容,比如微服务架构、分布式部署方案、多线程、支付、多语言、全链路性能压力测试等,让大家在实战中学习知识,在实战中不断进步。该课程是一个完整的微服务架构秒杀系统项目代码,案例具有很高的商业价值,大家可以根据自己的业务进行修改,便可以使用。本套课程可以满足世面上绝大多数企业级的业务场景,本课程全部代码可以直接部署企业,普通集群,支撑**并发;集群规模大,支撑亿级并发。本课程包含的技术: IDEA集成开发工具 SpringBoot2.0.2.RELEASE SpringCloudFinchley.RELEASE Thymeleaf(模板引擎技术) 微信支付 支付宝支付 银联支付 分布式数据库Mycat MySQL Druid RabbitMQ 分布式事务 分布式锁 事件驱动 多线程 MyBatis QuartzEhcache Redis Hystrix 单点登陆CAS Nginx Lua Restful AOP技术 性能压力测试Jemter VUE+jQuery+Ajax+NodeJS Python Go语言课程亮点: 1.与企业无缝对接、真实工业界产品 2.主流支付全覆盖(微信、支付宝、银联) 3.前后端分离(主流技术架构) 4.实现高并发请求和实现高可用架构解决方案 5.多语言(Java、Go、Python) 6.亿级微服务秒杀系统(支撑海量数据) 7.大型系统分布式部署方案 8.全链路性能压力测试  9.分布式事务解决方案 10.事件驱动设计解决方案 11.多线程技术的实战应用 12.高并发下的服务降级、限流实战 13.分布式架构师下实现分布式定时调度 14.集成MyBatis实现多数据源路由实战 15.集成Redis缓存实战 16.Eureka注册中心 17.OpenFeign声明式服务调用 18.Hystrix服务熔断降级方式 19.基于Hystrix实现接口降级实战 20.集成SpringCloud实现统一整合方案 21.全程代码实操,提供全部代码和资料 22.提供答疑和提供企业技术方案咨询购买提醒: 我本人在企业从业10年,因为热爱,所以坚持,下一个10年依然会在企业一线服务,因此对于课程中的技术点可以提供全方面的业务场景解决方案。我本人并非培训机构脱离一线业务场景的讲师,从业多年接触过大量的真实业务场景案例,后面会逐步通过教程案例分享我多年的实战经验,送给同行一句话:技术是服务于业务的,脱离一线业务场景就是耍流氓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值