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

    文章

    767

    浏览量

    95604
  • 嵌入式
    +关注

    关注

    5073

    文章

    19038

    浏览量

    303580
  • 周立功
    +关注

    关注

    38

    文章

    130

    浏览量

    37589

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

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

收藏 人收藏

    评论

    相关推荐

    在Compose中使用状态(State)

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

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

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

    玩转Spring状态

    说起Spring状态机,大家很容易联想到这个状态机和设计模式状态模式的区别是啥呢?没错,Spring
    的头像 发表于 06-25 14:21 890次阅读
    玩转Spring<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

    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 39次下载

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

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

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

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

    buck电路稳态电压推导过程

    buck电路(也称为降压转换器或降压稳压器)的稳态电压推导过程涉及理解其工作原理以及电路中的电压和电流关系。以下是一个简化的推导过程: Bu
    的头像 发表于 09-12 15:24 514次阅读