什么是状态机?有限状态机如何实现

来源:Golang编程网作者:椎名光头衔:网络博主
导读:本期聚焦于小伙伴创作的《什么是状态机?有限状态机如何实现》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《什么是状态机?有限状态机如何实现》有用,将其分享出去将是对创作者最好的鼓励。

状态机是一种用来描述系统在不同状态下,根据外部输入或内部事件触发,按照预设规则进行状态切换的抽象模型。它把系统的行为拆解为有限个明确的状态,以及状态之间的转换条件,让复杂的流程逻辑变得清晰可维护。有限状态机是状态机中最常用的类型,它的状态总数是有限的,每个状态都有明确的进入、退出逻辑和对应的转换规则。

什么是状态机?有限状态机如何实现

有限状态机的核心组成

一个完整的有限状态机通常包含以下四个核心部分:

  • 状态集合:系统所有可能处于的状态,状态数量必须是有限的。
  • 初始状态:系统启动后默认进入的第一个状态。
  • 输入集合:所有可能触发状态转换的事件或输入参数。
  • 转换规则:定义从某个状态接收到某个输入后,会切换到哪个新状态,以及是否需要执行对应的动作。

简单场景示例说明

我们可以用一个订单流程的场景来理解有限状态机,订单的状态集合可以是待支付、已支付、已发货、已完成、已取消,初始状态是待支付。当待支付状态下接收到支付成功的输入,就会转换到已支付状态;已支付状态下接收到发货的输入,就会转换到已发货状态,以此类推。每个状态转换都可以绑定对应的业务逻辑,比如支付成功后扣减库存,发货后更新物流信息等。

JavaScript实现有限状态机

下面用JavaScript实现一个简单的订单状态机,包含状态定义、转换规则配置和状态切换方法:

// 定义订单状态集合
const OrderState = {
  WAIT_PAY: 'wait_pay',
  PAID: 'paid',
  SHIPPED: 'shipped',
  FINISHED: 'finished',
  CANCELED: 'canceled'
};

// 定义转换规则,key为当前状态,value为输入对应的下一个状态和动作
const transitionMap = {
  [OrderState.WAIT_PAY]: {
    pay: { nextState: OrderState.PAID, action: () => console.log('支付成功,扣减库存') },
    cancel: { nextState: OrderState.CANCELED, action: () => console.log('订单取消,释放库存') }
  },
  [OrderState.PAID]: {
    ship: { nextState: OrderState.SHIPPED, action: () => console.log('订单发货,更新物流信息') },
    refund: { nextState: OrderState.CANCELED, action: () => console.log('订单退款,恢复库存') }
  },
  [OrderState.SHIPPED]: {
    confirm: { nextState: OrderState.FINISHED, action: () => console.log('订单确认完成,交易结束') }
  }
};

// 有限状态机类
class FiniteStateMachine {
  constructor(initialState) {
    this.currentState = initialState;
  }

  // 触发输入,执行状态转换
  handleInput(input) {
    const currentRules = transitionMap[this.currentState];
    if (!currentRules || !currentRules[input]) {
      console.log(`当前状态${this.currentState}不支持输入${input}`);
      return;
    }
    const { nextState, action } = currentRules[input];
    // 执行转换前的动作
    action();
    // 更新当前状态
    this.currentState = nextState;
    console.log(`状态已切换到:${this.currentState}`);
  }
}

// 使用示例
const orderFsm = new FiniteStateMachine(OrderState.WAIT_PAY);
orderFsm.handleInput('pay'); // 支付成功,扣减库存 状态已切换到:paid
orderFsm.handleInput('ship'); // 订单发货,更新物流信息 状态已切换到:shipped
orderFsm.handleInput('confirm'); // 订单确认完成,交易结束 状态已切换到:finished

Python实现有限状态机

同样的逻辑也可以用Python实现,结构更加清晰,适合后端业务逻辑使用:

# 定义订单状态常量
class OrderState:
    WAIT_PAY = "wait_pay"
    PAID = "paid"
    SHIPPED = "shipped"
    FINISHED = "finished"
    CANCELED = "canceled"

# 定义有限状态机类
class FiniteStateMachine:
    def __init__(self, initial_state):
        self.current_state = initial_state
        # 定义转换规则,格式为 {当前状态: {输入: (下一个状态, 动作函数)}}
        self.transition_map = {
            OrderState.WAIT_PAY: {
                "pay": (OrderState.PAID, self._pay_action),
                "cancel": (OrderState.CANCELED, self._cancel_action)
            },
            OrderState.PAID: {
                "ship": (OrderState.SHIPPED, self._ship_action),
                "refund": (OrderState.CANCELED, self._refund_action)
            },
            OrderState.SHIPPED: {
                "confirm": (OrderState.FINISHED, self._confirm_action)
            }
        }

    def _pay_action(self):
        print("支付成功,扣减库存")

    def _cancel_action(self):
        print("订单取消,释放库存")

    def _ship_action(self):
        print("订单发货,更新物流信息")

    def _refund_action(self):
        print("订单退款,恢复库存")

    def _confirm_action(self):
        print("订单确认完成,交易结束")

    def handle_input(self, input_event):
        current_rules = self.transition_map.get(self.current_state, {})
        if input_event not in current_rules:
            print(f"当前状态{self.current_state}不支持输入{input_event}")
            return
        next_state, action = current_rules[input_event]
        # 执行转换动作
        action()
        # 更新状态
        self.current_state = next_state
        print(f"状态已切换到:{self.current_state}")

# 使用示例
if __name__ == "__main__":
    order_fsm = FiniteStateMachine(OrderState.WAIT_PAY)
    order_fsm.handle_input("pay")
    order_fsm.handle_input("ship")
    order_fsm.handle_input("confirm")

有限状态机的适用场景

有限状态机适合处理状态明确、转换规则固定的场景,比如:

  • 游戏角色的状态控制,比如待机、移动、攻击、死亡等状态切换。
  • 业务流程引擎,比如审批流程、订单流程、工单流程等。
  • 网络协议解析,比如TCP连接的状态管理、自定义协议的帧解析。
  • UI组件的状态管理,比如按钮的禁用、加载、正常状态切换。

当业务中的状态数量较多、转换逻辑复杂时,使用有限状态机可以让代码结构更清晰,后续修改状态规则时只需要调整转换配置,不需要修改核心的状态切换逻辑,降低维护成本。

状态机有限状态机状态模式状态转换FSM修改时间:2026-07-01 12:54:54

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。