网易首页 > 网易号 > 正文 申请入驻

嵌入式设计模式--C语言的状态机模式

0
分享至

嵌入式设计模式基础--C语言的继承封装与多态

嵌入式设计模式--C语言的简单工厂模式

嵌入式设计模式--C语言的抽象工厂模式

嵌入式设计模式--C语言的建造者模式

嵌入式设计模式--C语言的观察者模式

嵌入式设计模式--C语言的原型模式

嵌入式设计模式--C语言的桥接模式

嵌入式设计模式--C语言的中介者模式

嵌入式设计模式--C语言的装饰器模式

嵌入式设计模式--C语言的外观模式

嵌入式设计模式--C语言的解释器模式

嵌入式设计模式--C语言的享元模式

嵌入式设计模式--C语言的代理模式

嵌入式设计模式--C语言的模板方法模式

备忘录模式×C语言:嵌入式开发进阶

嵌入式设计模式--C语言的迭代器模式

本期我们要更新的是行为型设计模式--状态(机)模式。

什么是状态模式?

根据GoF《设计模式》原著,状态模式(State Pattern)的核心意图:

"Allow an object to alter its behavior when its internal state changes. The object will appear to change its class."

中文含义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

为什么需要状态模式?

状态模式解决了传统状态机实现中代码难以维护、扩展困难的核心痛点,通过将状态封装为独立对象,实现行为与状态的绑定,让状态转移清晰化、系统可扩展化。

传统软件编码的困境

  • 分支复杂

if-else与switch-case随状态数激增,函数冗长,圈复杂度过高。

  • 职责混乱

上下文持有所有状态行为,修改易引入回归Bug。

  • 扩展僵化

新增状态需改现有代码,违反开闭原则,迭代风险高。

状态模式的三重解耦

  • 行为与状态绑定

状态对象自主实现行为,上下文通过多态分发调用,消除条件判断。

  • 转移逻辑自治

状态内部决定"事件→下一状态",避免集中式转移表臃肿。

  • 上下文精简

仅维护current_state指针,行为全部委托,代码量降70%+。

核心角色
核心角色


  • 上下文(Context)

持有当前状态对象的引用,定义客户端使用的主要接口。所有与状态相关的行为请求都委托给当前状态对象处理,自身不直接实现状态逻辑,只负责状态切换时的对象替换。

  • 抽象状态(State)

定义状态接口,声明与上下文特定状态相关的行为方法。作为所有具体状态的公共规范,确保状态对象可以互相替换,使上下文能以统一方式调用不同状态的行为。

  • 具体状态(ConcreteState)

实现抽象状态接口,封装上下文在该状态下的具体行为规则和状态转移条件。每个具体状态类只关注自身状态下的操作逻辑,并决定何时以及切换到哪个下一个状态。

核心思想

状态模式将状态封装为独立的类,把与状态相关的行为分散到各个状态类中。当对象的状态改变时,其行为也随之改变,无需使用大量的条件判断语句(if-else 或 switch-case)

UML示例
UML示例


  • Context 通过 state 字段关联抽象 State,而非直接关联具体状态

  • 具体状态 既实现 State 接口,又依赖 Context(通过参数传入),以便在条件满足时触发状态转移

  • 状态转换可由 Context 控制(外部驱动),也可由 ConcreteState 自身控制(满足条件后主动申请切换),后者更常见

举个例子

下面我们给到一个简单的电机控制的例子来展示状态模式。

核心体现

  • 无 switch-case:

    main 只调用 motor_request,行为完全由当前状态对象决定

  • 自驱动转移:各状态类内部判断切换条件(如 startingState 检测到速达目标后主动申请切运行态)

  • 新增状态易扩展:增加新状态只需新建结构体,不改动现有状态代码

抽象状态上下文具体状态--停止状态具体状态--启动状态具体状态--运行状态具体状态--减速停止状态具体实现
  • 运行日志:

=== 启动到1000转 ===

状态切换: 停止 -> 启动

启动中: 转速=100

启动中: 转速=200

启动中: 转速=1000

状态切换: 启动 -> 运行

=== 目标改为0转(停机)===

状态切换: 运行 -> 减速

减速中: 转速=900

减速中: 转速=0

状态切换: 减速 -> 停止

==== 停止 ====

运行状态机模型
状态机总结

状态模式

允许对象在内部状态改变时改变其行为,将状态封装为独立类,分散状态相关行为,避免冗长的条件分支。

核心角色包括:上下文维护当前状态并委托行为,抽象状态定义接口规范,具体状态实现特定行为并控制状态转移。其优势在于消除复杂条件判断、集中状态逻辑、显式化转换规则,支持通过新增状态类扩展系统。

在嵌入式开发中,该模式

广泛应用于协议解析、电源管理、电机控制等场景。通过函数指针模拟状态接口,既保留封装性与可扩展性,又避免动态内存开销

,是资源受限环境下实现清晰状态机的经典方案。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
有个表演型人格父母是啥体验?网友:很累,他们的爱总带着控制欲

有个表演型人格父母是啥体验?网友:很累,他们的爱总带着控制欲

带你感受人间冷暖
2026-01-17 00:10:06
乌克兰反攻进展超出预期

乌克兰反攻进展超出预期

名人苟或
2026-02-15 15:31:13
世界壶联回应作弊事件:违规但结果无法更改,骂人队员被口头警告

世界壶联回应作弊事件:违规但结果无法更改,骂人队员被口头警告

全景体育V
2026-02-14 21:35:20
马杜罗认输,特朗普宣布访委,与代总统达成默契,给全球上了一课

马杜罗认输,特朗普宣布访委,与代总统达成默契,给全球上了一课

东极妙严
2026-02-15 11:50:25
1985年,19岁的苏菲·玛索在东京街头,英气十足

1985年,19岁的苏菲·玛索在东京街头,英气十足

娱你同欢
2026-02-15 10:12:04
30多岁中国籍女子从韩机场前高架桥坠亡:穿过马路后坠落,尚未完成离境手续

30多岁中国籍女子从韩机场前高架桥坠亡:穿过马路后坠落,尚未完成离境手续

红星新闻
2026-02-15 12:00:15
斯大林死在地上10小时,满身屎尿没人管:那个让世界害怕的人。

斯大林死在地上10小时,满身屎尿没人管:那个让世界害怕的人。

房产衫哥
2026-02-13 17:22:30
中到大雨!10级大风!猛降17℃?强冷空气今天杀到...

中到大雨!10级大风!猛降17℃?强冷空气今天杀到...

我爱大绍兴
2026-02-15 15:44:40
大疆前销售副总裁涉嫌非国家工作人员受贿罪被刑拘

大疆前销售副总裁涉嫌非国家工作人员受贿罪被刑拘

澎湃新闻
2026-02-15 18:08:26
74岁大爷:每月6500都给你花,但你要答应我一个要求 大妈:满足你

74岁大爷:每月6500都给你花,但你要答应我一个要求 大妈:满足你

人间百态大全
2026-02-15 06:40:03
“资助不起装什么孙子!”2006年,贫困大学生向海清向媒体怒斥

“资助不起装什么孙子!”2006年,贫困大学生向海清向媒体怒斥

百态人间
2026-02-05 15:42:49
美国为何不愿平视中国?牢A揭秘:在西方眼里,我们不能算“人”

美国为何不愿平视中国?牢A揭秘:在西方眼里,我们不能算“人”

史智文道
2026-02-15 17:31:46
天下苦英伟达久矣!字节跳动被曝自研芯片成功 已进入量产

天下苦英伟达久矣!字节跳动被曝自研芯片成功 已进入量产

快科技
2026-02-15 09:28:03
日本抓扣我渔民,人还没扣满24小时,就被解放军一招制服

日本抓扣我渔民,人还没扣满24小时,就被解放军一招制服

肖兹探秘说
2026-02-14 19:29:02
突发!郑钦文退出迪拜赛,原因揭晓,错失提升排名良机!

突发!郑钦文退出迪拜赛,原因揭晓,错失提升排名良机!

大秦壁虎白话体育
2026-02-15 15:49:24
果然,出门在外“胡说八道”能省去很多麻烦,这些方法太管用了!

果然,出门在外“胡说八道”能省去很多麻烦,这些方法太管用了!

另子维爱读史
2025-12-12 20:08:38
不打了!宣布赛季报销!正式俯冲NBA状元签

不打了!宣布赛季报销!正式俯冲NBA状元签

篮球实战宝典
2026-02-14 20:34:34
前勇士、湖人冠军中锋麦基:我将加入北京首钢

前勇士、湖人冠军中锋麦基:我将加入北京首钢

懂球帝
2026-02-15 09:17:17
久久等不到中国贺电,高市用4个字喊话中国,中方的回应让其死心

久久等不到中国贺电,高市用4个字喊话中国,中方的回应让其死心

娱乐的宅急便
2026-02-15 16:40:56
海南树上果,湖南口中瘾?槟榔产地在海南,为啥吃的人大多在湖南

海南树上果,湖南口中瘾?槟榔产地在海南,为啥吃的人大多在湖南

向航说
2026-01-13 00:50:03
2026-02-15 18:28:50
呼呼历史论
呼呼历史论
分享有趣的历史
467文章数 16332关注度
往期回顾 全部

科技要闻

发春节红包的大厂都被约谈了

头条要闻

网红带货"100%纯牛肉"涉虚假宣传 事后道歉但拒绝赔偿

头条要闻

网红带货"100%纯牛肉"涉虚假宣传 事后道歉但拒绝赔偿

体育要闻

最戏剧性的花滑男单,冠军为什么是他?

娱乐要闻

河南春晚被骂上热搜!大量广告满屏AI

财经要闻

谁在掌控你的胃?起底百亿"飘香剂"江湖

汽车要闻

奔驰中国换帅:段建军离任,李德思接棒

态度原创

旅游
亲子
艺术
公开课
军事航空

旅游要闻

红墙为底,福字点睛,繁花作伴——中山公园的新春大片无需滤镜

亲子要闻

年夜饭这盘“毒饺子”,正在悄悄毁了无数娃,很多家长却毫不知情

艺术要闻

宋徽宗耗费30年,寻得“二王”100幅真迹!

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普:在俄乌冲突问题上 泽连斯基必须行动起来

无障碍浏览 进入关怀版