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

状态机(State Machine)详解

状态机(State Machine)详解

本质概念

状态机是一种​​数学建模工具​​,用于描述系统在不同状态之间的转移过程。它的核心思想是:​​系统在任何给定时刻只处于有限状态中的某一种状态,外部输入(事件)会触发状态转移,并可能伴随动作的执行​​。

graph LRA[状态A] -->|事件X/动作1| B[状态B]B -->|事件Y/动作2| C[状态C]C -->|事件Z/动作3| A

三大核心组件

  1. ​状态(States)​​:

    • 系统可能存在的有限个​​稳定状况​
    • 分为初始状态、中间状态、终止状态
    • 例如:红绿灯的红灯绿灯黄灯
  2. ​转移(Transitions)​​:

    • 状态之间转换的​​规则​
    • 由​​事件(输入)​​触发
    • 可附带​​动作(输出)​
    • 例如:绿灯状态下收到计时信号→黄灯,同时启动倒计时
  3. ​事件(Events)​​:

    • 触发状态转移的​​外部输入​
    • 例如:用户操作、系统消息、时间信号

状态机类型对比

类型名称特点应用场景
​米利型​Mealy Machine转移依赖当前状态​​和输入​大多数实际应用
​摩尔型​Moore Machine转移​​仅依赖​​当前状态简单控制逻辑
​层次型​Hierarchical State Machine状态可嵌套子状态机复杂UI系统
​并行型​Parallel State Machine多个状态机并发运行多任务处理系统

代码实现:自动售货机状态机

from enum import Enum, auto# 定义状态
class VendingState(Enum):IDLE = auto()        # 空闲状态SELECTING = auto()   # 选择商品PAYING = auto()      # 支付中DISPENSING = auto()  # 出货中# 实现售货机状态机
class VendingMachine:def __init__(self):self.state = VendingState.IDLEself.selected_item = None# 事件处理def select_item(self, item):if self.state == VendingState.IDLE:print(f"已选择商品: {item}")self.selected_item = itemself.state = VendingState.SELECTINGelse:print("当前不能选择商品")def insert_money(self, amount):if self.state == VendingState.SELECTING:if amount >= 10:  # 假设商品10元print("付款成功")self.state = VendingState.PAYINGself.dispense()else:print("金额不足")else:print("未选择商品")def dispense(self):if self.state == VendingState.PAYING:print(f"正在出货: {self.selected_item}")self.state = VendingState.DISPENSINGself.complete()def complete(self):print("交易完成,谢谢惠顾")self.state = VendingState.IDLEself.selected_item = None# 测试售货机工作流程
vm = VendingMachine()
vm.select_item("可乐")
vm.insert_money(10)

应用场景

  1. ​UI系统​​:

  2. ​游戏开发​​:

  3. ​通信协议​​(TCP状态机):

高级扩展概念

  1. ​层级状态机​​:

    class ComplexState:def __init__(self):self.main_state = MainState.STATE_Aself.sub_state = SubState.SUBSTATE_1def handle_event(self, event):# 先处理子状态if self.sub_state == SubState.SUBSTATE_1:# 子状态处理逻辑...pass# 父状态处理elif self.main_state == MainState.STATE_A:# 父状态逻辑...pass
  2. ​状态图工具​​:

    • PlantUML:基于文本的状态图生成
    • Statecharts:复杂状态机建模标准
    • XState:JavaScript状态机库
  3. ​时序逻辑检查​​:

    • 使用LTL(线性时序逻辑)验证状态转移
    ◻(绿灯 → ◊(黄灯)) # 绿灯最终必定变为黄灯
    ¬◊(绿灯 ∧ 红灯)    # 绿灯和红灯不可能同时存在

设计原则

  1. ​有限状态原则​​:

    • 系统状态必须是有限且明确的
  2. ​单激活原则​​:

    • 任一时刻只有一个活动状态(并行状态机除外)
  3. ​明确转移原则​​:

    • 每个转移必须有明确的触发条件
  4. ​动作隔离原则​​:

    • 状态转移过程中的动作不应改变其他状态

优化技巧

  1. ​状态模式实现​​:

    class State(ABC):@abstractmethoddef handle(self, context): passclass ConcreteStateA(State):def handle(self, context):context.state = ConcreteStateB()class Context:def __init__(self):self.state = ConcreteStateA()def request(self):self.state.handle(self)
  2. ​状态表驱动法​​:

    transitions = {(VendingState.IDLE, 'SELECT'): ('SELECTING', select_action),(VendingState.SELECTING, 'PAY'): ('PAYING', payment_action),(VendingState.PAYING, 'DISPENSE'): ('DISPENSING', dispense_action)
    }def handle_event(event):current_state = machine.statekey = (current_state, event)if key in transitions:new_state, action = transitions[key]action()machine.state = new_state
  3. ​可视化调试​​:

    def trace_state_change(old, new, event):print(f"State: {old.name} → {new.name} [Event: {event}]")logger.debug(f"Transition at {datetime.now()}")

状态机通过将复杂流程分解为离散的状态和转移关系,显著提高了系统的可预测性和可维护性,是解决复杂逻辑控制的利器。

http://www.xdnf.cn/news/1041607.html

相关文章:

  • 车载功能框架 --- 整车安全策略
  • 第六届经济管理与大数据应用国际学术会议 (ICEMBDA 2025)
  • 数据库学习(六)——MySQL事务
  • QT打包应用
  • 天邑TEWA-808AE高安版_S905L3B融合机破解TTL刷机包
  • python做题日记(17)
  • 15.vue.js的watch()和watchEffect()(2)
  • JAVA理论第十八章-JWT杂七杂八
  • Visualized_BGE 安装—多模态嵌入技术
  • Java 复习题选择题(1)(Java概述)
  • LLMs 系列实操科普(5)
  • 【卫星通信】Skylo与ViaSat标准建议详解:基于NB-IoT NTN通过GEO卫星实现IMS语音通话的解决方案
  • springboot在线BLOG网
  • SCADA|信创KingSCADA4.0历史报警查询的差异
  • 永磁同步电机控制算法--双矢量模型预测转矩控制MPTC(占空比)
  • [直播推流] 本地创建 nginx服务器
  • DataHub 架构设计与模块规划
  • 深度解析SpringBoot自动化部署实战:从原理到最佳实践
  • Android 安卓应用分身多开 适用于没有自带分身多开的Android设备,隐藏应用、应用锁、私密相册等管理,解锁永久Vip会员功能
  • 【精华】这样设计高性能短链生成系统
  • 记利用AI模型制作DataDump Scripts生成工具
  • 理解 C++ 的 this 指针
  • Seata与消息队列(如RocketMQ)如何实现最终一致性?
  • 【构建】CMake 构建系统重点内容
  • springboot音乐网站与分享平台
  • MySQL-DML语句深度解析与实战指南
  • 60天python训练计划----day52
  • Golang 在 Linux 平台上的并发控制
  • LeetCode - LCR 173. 点名
  • 基于深度学习的人类活动识别模型研究:HAR-DeepConvLG的设计与应用