当前位置: 首页 > news >正文

带历史状态的层次状态机(HSM with History)

带历史状态的层次状态机(HSM with History)

一、先理解:为什么需要“历史状态”?

先看一个生活场景:

你正在电脑上写代码(编辑状态),突然想查资料,于是打开浏览器(切换到浏览状态)。在浏览器里,你又打开了视频网站看视频(播放状态)。看完后,你关掉浏览器——你希望回到之前写代码的状态,并且光标还在刚才编辑的位置,而不是回到编辑器主菜单。

这就是历史状态的价值:记住你“上次离开时的具体位置”,回来时直接恢复,而不是回到父状态的默认入口。


二、核心概念

2.1 层次状态机(Hierarchical State Machine)

普通状态机(平面状态机)所有状态平级,状态一多,转换表就爆炸。

层次状态机允许状态嵌套:

开机状态(PowerOn) ├── 待机状态(Idle) ← 子状态 └── 工作状态(Working) ← 子状态 ├── 编辑状态(Editing) ← 孙状态 └── 预览状态(Previewing)

核心机制

  • 子状态可以继承父状态的行为(没有处理的事件交给父状态)。
  • 状态转换可以发生在不同层级,大大简化转换表。
2.2 历史状态(History State)

历史状态是一个伪状态(不真正执行逻辑),它像一个“书签”,记录退出复合状态时所在的子状态。

两种历史类型

类型英文含义
浅历史Shallow History只记住直接子状态,不继续往下记
深历史Deep History记住完整的嵌套路径,回到最深层状态

三、工作原理

3.1 层次状态机的转换规则

当事件发生时:

  1. 当前状态先尝试处理
  2. 如果当前状态不能处理,向上传递给父状态
  3. 直到某个状态处理了事件,或到达根状态
3.2 历史状态的工作机制

用图形理解:

┌─────────────────────────────────┐ │ 电视机(TV) │ │ ┌─────────────┐ ┌───────────┐ │ │ │ 关机状态 │ │ 开机状态 │ │ │ │ (Off) │ │ (On) │◀─┼── 浅历史 (H) │ └─────────────┘ │ ┌───────┐ │ │ │ │ │ 直播 │ │ │ │ │ │(Live) │ │ │ │ │ ├───────┤ │ │ │ │ │ 点播 │ │ │ │ │ │(VOD) │ │ │ │ │ └───────┘ │ │ │ └───────────┘ │ └─────────────────────────────────┘

浅历史(H):关机再开机,回到上次的直接子状态(比如“直播”或“点播”),但不会回到点播里面的“暂停中”。

深历史(DH):关机再开机,回到上次的完整状态路径(比如“开机 → 点播 → 暂停中”)。


四、完整实例:手机音乐播放器

4.1 状态结构
手机(Phone) ├── 待机(Idle) ← 默认子状态 └── 音乐模式(MusicMode) ← 浅历史 + 深历史 ├── 播放中(Playing) │ ├── 正常播放(NormalPlay) │ └── 随机播放(ShufflePlay) └── 暂停(Paused)
4.2 场景演示
步骤操作当前状态历史记录
1开机待机(Idle)
2打开音乐App音乐模式 → 播放中 → 正常播放
3切换到随机播放音乐模式 → 播放中 → 随机播放
4暂停音乐模式 → 暂停浅历史:播放中(不记子状态)
深历史:播放中 → 随机播放
5切换到待机待机历史已记录
6进入音乐模式如果使用浅历史:回到“播放中”(但不知道是正常还是随机,默认进正常)
如果使用深历史:回到“播放中 → 随机播放”
4.3 伪代码演示(带注释)
// 状态IDtypedefenum{ST_IDLE,// 待机ST_MUSIC_MODE,// 音乐模式(复合状态)ST_PLAYING,// 播放中(音乐模式的子状态)ST_PAUSED,// 暂停(音乐模式的子状态)ST_NORMAL_PLAY,// 正常播放(播放中的子状态)ST_SHUFFLE_PLAY,// 随机播放(播放中的子状态)}State;// 带历史的状态机typedefstruct{State current;State history_shallow;// 浅历史:只记直接子状态State history_deep[4];// 深历史:记录完整路径栈}HsmWithHistory;// 进入音乐模式时的逻辑voidenter_music_mode(HsmWithHistory*hsm,bool use_deep_history){if(use_deep_history&&hsm->history_deep[0]!=ST_NONE){// 深历史:恢复完整路径hsm->current=hsm->history_deep[0];// 例如 ST_SHUFFLE_PLAYrestore_full_stack(hsm->history_deep);}elseif(hsm->history_shallow!=ST_NONE){// 浅历史:只恢复到直接子状态hsm->current=hsm->history_shallow;// 例如 ST_PLAYING// 进入 ST_PLAYING 后,由其默认子状态 ST_NORMAL_PLAY}else{// 无历史:进入默认子状态hsm->current=ST_PLAYING;// 默认}}

五、为什么需要“历史状态”?总结三大价值

价值说明
用户体验好从子菜单返回时回到上次位置,而不是主页(手机App、电视机顶盒)
减少状态爆炸不需要为每种“深层位置”单独设计状态
简化转换逻辑只需要转换到复合状态,历史机制自动处理恢复细节

六、一句话记忆

浅历史记直接儿子,深历史记整条血脉;复合状态出去再回来,历史状态让你回到原来的位置。

http://www.jsqmd.com/news/706828/

相关文章:

  • 切丁机生产厂家生存破局:企业决策者关键策略深度解析
  • 深度学习在影评情感分析中的应用与实践
  • DemoGPT:从自然语言描述到完整Web应用的AI智能体编程实践
  • 2026年Q2正规PCB硬件开发标杆名录:QT应用程序开发/QT程序开发/QT软件开发/单片机开发/单片机电路开发/选择指南 - 优质品牌商家
  • Fairseq-Dense-13B-Janeway开源可部署:MIT许可,允许商用、修改、分发与闭源集成
  • 代理模式完全解析:从直接访问到智能控制的访问代理
  • 成都地区、低合金H型钢、400X400X13X21、Q355B、包钢、现货批发供应 - 四川盛世钢联营销中心
  • Hugo博客自动化发布:基于OpenClaw的智能工作流实践
  • 成都地区、低合金H型钢、588X300X12X20、Q355B、包钢、现货批发供应 - 四川盛世钢联营销中心
  • 基于向量数据库的视频语义检索:从多模态特征提取到工程实践
  • 自编码器在回归任务中的特征提取与应用实践
  • 成都地区、H型钢、800X300X14X26、Q235B、包钢、现货批发供应 - 四川盛世钢联营销中心
  • OpenAI Swarm多智能体系统:架构设计与工程实践指南
  • 网络初级第五次作业(真机实验配置)
  • 47.网络基础
  • DDTree 深度解析:从 Block Diffusion 到 Diffusion Draft Tree
  • SillyTavern本地AI聊天前端:从架构解析到高阶部署实战
  • 3步构建企业级数据资产统一管理平台:OpenMetadata深度实践指南
  • 信自己,择热爱,事缓则圆
  • Python实现进化策略算法:原理与优化实践
  • GDIO 深度解析:用“除以2“的数学魔法,终结 AI 的灾难性遗忘
  • LSTM时间序列预测中的权重正则化优化实践
  • coze(扣子)5分钟产出爆火短视频操作详解
  • 大模型智能体框架:让LLM学会使用工具,实现自动化任务执行
  • 每一次科技的重大变化和政策的重大变化都是一次财富重新分配的机会,有变化就会有需求,你能满足需求就能获得利润
  • Unsloth框架:高效微调大语言模型的工程实践指南
  • Flutter 鸿蒙跨端开发实战:集成三方库实现鸿蒙设备 TODO 清单应用
  • 小皮面板完全安装教程:2026年VPS新手从零到上线全攻略
  • HEIF Utility:Windows平台HEIF图片处理的终极解决方案
  • 嵌入式Linux学习笔记 | 数据结构(Day02)顺序表核心功能实现 + 快速排序 + 折半查找 + 作业实战