0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

State状态模式推导过程以及完整实现

UtFs_Zlgmcu7890 来源:互联网 作者:佚名 2017-10-17 06:42 次阅读

近日周立功教授公开了数年的心血之作《程序设计与数据结构》,电子版已无偿性分享到电子工程师与高校群体下载,经周立功教授授权,特对本书内容进行连载。

>>>1.1.1动作类

前面详细介绍了State状态模式的推导过程以及完整的实现,采用了简单的打印语句作为作为4个动作的实现示例。然而,实际动作是很有可能发生变化的,由于动作直接在事件处理方法中执行。比如,LOCKED状态的card事件处理方法定义为:

1 void locked_card(turnstile_t *p_turnstile)

2 {

3 turnstile_state_set(p_turnstile, &unlocked_state);

4 printf("unclock\n"); // 执行unlock动作

5 }

由此可见,只要动作发生变化,都必须修改事件处理方法。基于此,不妨将闸机动作单独封装在一个动作类中,详见图 4.12

图 4.12 状态机类图

程序清单4.23程序清单4.24所示为动作类的声明和实现,为何要为这么简单的动作创建类呢?因为只有预测变换和管理变化才能拥抱变化,只有这样才能使软件具有可扩展性和可维护性。

程序清单4.23动作函数声明(turnstile_action.h文件内容

1 #pragma once

2

3 void turnstile_action_lock(void);

4 void turnstile_action_unlock(void);

5 void turnstile_action_alarm(void);

6 void turnstile_action_thankyou(void);

程序清单4.24动作函数实现(turnstile_action.c文件内容)

1 void turnstile_action_lock(void)

2 {

3 printf("clock\n");

4 }

5

6 void turnstile_action_unlock(void)

7 {

8 printf("unclock\n");

9 }

10

11 void turnstile_action_alarm(void)

12 {

13 printf("alarm\n");

14 }

15

16 void turnstile_action_thankyou(void)

17 {

18 printf("thank you\n");

19 }

程序中的alarm、unlock、thankyou和lock动作对应的动作函数分别为: alarm()、unlock()、thankyou()和lock()。当将4个动作分别由4个函数实现时,则具体动作从状态机中分离出来了。比如,LOCKED状态下的card事件处理方法定义为:

1 void locked_card(turnstile_t *p_turnstile)

2 {

3 turnstile_state_set(p_turnstile, &unlocked_state);

4 turnstile_action_unlock (); // 执行unlock动作

5 }

这是一种良好的设计因为动作接口优雅地解除了FSM的状态变换逻辑和它要执行的动作之间的耦合。这样一来就算另外一个具有完全不同逻辑的FSM,也可以在没有任何影响的情况下使用这些动作接口。

由于在处理动作时,不需要任何数据,它是一个只有方法,没有属性的动作类,因此没有刻意使用结构体为其定义专门的类型。而实际的动作类可能会包含一些数据,其定义如下:

typedef struct _turnstile_action {

// some data

} turnstile_action_t;

此时,当动作发生变化时,仅需修改动作类的函数,无需修改状态机的事件处理函数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电子工程师
    +关注

    关注

    252

    文章

    758

    浏览量

    95239
  • 嵌入式
    +关注

    关注

    4981

    文章

    18281

    浏览量

    288387
  • 周立功
    +关注

    关注

    38

    文章

    130

    浏览量

    37081

原文标题:周立功:状态机——动作类

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在Compose中使用状态(State)

    对于开发者来说,状态 (State) 指应用中可以随时间变化的任何值。我们的应用天然便是拥有状态的,无论您将数据存储在本地还是服务器中,状态都可以使这些数据更有价值。接下来,我们就以应
    的头像 发表于 04-21 11:05 4371次阅读

    状态机编程实例-面向对象的状态设计模式

    本编介绍了状态机编程的第3种方法——面向对象的状态设计模式,通过C++的继承特性,以及类指针,实现炸弹拆除小游戏中的
    的头像 发表于 06-28 09:04 914次阅读
    <b class='flag-5'>状态</b>机编程实例-面向对象的<b class='flag-5'>状态</b>设计<b class='flag-5'>模式</b>

    谁有PMSM传递函数的推导过程的资料?

    谁有PMSM传递函数的推导过程的资料?发一下谢谢了PMSM的FOC控制中电流环的PI控制器的时候,好多资料上就干巴巴列出了一个现成的PMSM的传递函数,看的晕头转向的,有没有简单的推导过程
    发表于 01-21 16:13

    经验分享:临界模式下的PFC电感量推导过程

    临界模式PFC电感量计算真的非常简单!对于很多工程师来说开关电源PFC电感的计算比较懵,今天我对临界模式下的PFC做了一下简单的推导,我觉得比反激正激变压器要更好更容易计算,也更好理解。好了我们一起
    发表于 04-28 08:00

    LLC增益曲线过程推导和参数如何计算

    详细过程在PDF中,这里就不一一展示了。直流增益公式推导直流LLC谐振电源,其实也相当于buck-boost电源。要想弄明白和推导理论公式,首先温习一下傅里叶级数和RLC串联谐振知识。 傅里叶级数
    发表于 05-19 09:19

    直线拟合求解的推导过程

    (1)求解的推导过程:最小二乘拟合直线的推导过程如下:假设直线方程为:设有n对观测值(xi,yi),则列出如下方程:整理得:其中A、EA、L的表达式如下:最后解算直线拟合求解的
    发表于 08-18 08:04

    ArkUI的TS模式下@State状态现象是怎样的?

    先看一个简单的布局@Entry@Componentexport struct MeTabContent {private id: string = '10000'@State bgColor
    发表于 05-16 11:44

    State Machine Coding Styles for Synthesis

    本文论述了状态机的verilog编码风格,以及不同编码风格的优缺点, Steve Golsons 1994 paper, State Machine Design Techniques
    发表于 01-17 11:22 0次下载
    <b class='flag-5'>State</b> Machine Coding Styles for Synthesis

    对象间交互推导过程模式选择

    式的对象间交互 基于闭包的对象间交互 推导过程 总结 前言 闭包在什么场景下才是最优选择?理由?补充说明一下:很多场景都适用闭包,但不是所有场景下闭包都是最优选择。 这篇文章主要就是回答这个问题的。 但是在直接切入闭包之前,我们需要有一个
    发表于 09-25 15:26 0次下载

    Logistic回归数学推导以及python实现

    Logistic回归数学推导以及python实现
    发表于 02-25 14:48 7次下载

    反激详细推导过程

    反激电路工作模式一般有三种,断续模式(DCM),连续模式(CCM),临界模式(CRM)以下的推导公式,前期条件是你必须认识到反激变压器他的本
    发表于 06-19 10:20 38次下载

    状态模式(状态机)

    以前写状态机,比较常用的方式是用 if-else 或 switch-case,高级的一点是函数指针列表。最近,看了一文章《c语言设计模式状态模式(
    发表于 12-16 16:53 7次下载
    <b class='flag-5'>状态</b><b class='flag-5'>模式</b>(<b class='flag-5'>状态</b>机)

    电机控制---SVPWM扇区判断的实现以及推导过程

    电机控制—SVPWM扇区判断的实现以及推导过程 1.一般的Svpwm模块中,输入量为Vα、Vβ,得到三相计数器的Compare的值,最后输出U、V、W三相电压。在FOC控制中实现Svp
    发表于 05-05 11:05 1次下载
    电机控制---SVPWM扇区判断的<b class='flag-5'>实现以及</b><b class='flag-5'>推导</b><b class='flag-5'>过程</b>

    设计模式行为型:状态模式

    状态模式State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型
    的头像 发表于 06-07 11:20 383次阅读
    设计<b class='flag-5'>模式</b>行为型:<b class='flag-5'>状态</b><b class='flag-5'>模式</b>

    UVM设计模式状态模式介绍

    软件设计中,FSM(Finite-State Machine)分为3部分:状态State),事件(Event),动作(Action)。
    的头像 发表于 08-22 09:14 569次阅读
    UVM设计<b class='flag-5'>模式</b>之<b class='flag-5'>状态</b><b class='flag-5'>模式</b>介绍