什么是狀態機?狀態機入門

狀態機:優雅管理復雜邏輯的Python實踐

在軟件開發中,狀態機(Finite State Machine, FSM) 是管理多狀態轉換的利器。它將行為分解為離散的狀態事件轉移規則,大幅提升代碼的可讀性與可維護性。本文通過Python示例解析狀態機的核心思想與實現技巧。

一、狀態機是什么?

狀態機由三個核心組件構成:

  • 狀態(State):系統在某一時刻的穩定條件(如訂單的“待支付”、“已發貨”)
  • 事件(Event):觸發狀態轉換的動作(如用戶付款、超時)
  • 轉移(Transition):狀態間轉換的規則和條件

狀態機的核心價值在于:

  • 將復雜的狀態邏輯拆解為離散單元
  • 避免深層嵌套的if-else判斷
  • 新狀態擴展時不影響現有邏輯

二、Python實現狀態機的三種方式

方式1:使用輕量級庫transitions

transitions是Python最流行的狀態機庫,通過聲明式語法快速構建FSM:

from transitions import Machineclass Order:pass  # 業務邏輯類# 定義狀態和轉移規則
states = ['created', 'paid', 'shipped', 'completed']
transitions = [{'trigger': 'pay', 'source': 'created', 'dest': 'paid'},{'trigger': 'ship', 'source': 'paid', 'dest': 'shipped'},{'trigger': 'deliver', 'source': 'shipped', 'dest': 'completed'}
]order = Order()
machine = Machine(model=order, states=states, transitions=transitions,initial='created'
)print(order.state)  # 輸出: created
order.pay()         # 觸發狀態轉移
print(order.state)  # 輸出: paid

方式2:基于生成器的狀態機

利用生成器的yield實現輕量級狀態流轉:

def order_state_machine():state = 'created'while True:event = yield stateif state == 'created' and event == 'pay':state = 'paid'elif state == 'paid' and event == 'ship':state = 'shipped'elif state == 'shipped' and event == 'deliver':state = 'completed'# 使用示例
fsm = order_state_machine()
current_state = next(fsm)  # 初始化,狀態為'created'
current_state = fsm.send('pay')   # 狀態轉為'paid'
current_state = fsm.send('ship') # 狀態轉為'shipped'

方式3:狀態模式(面向對象)

通過多態實現狀態行為隔離:

from abc import ABC, abstractmethodclass OrderState(ABC):@abstractmethoddef next_state(self):passclass CreatedState(OrderState):def next_state(self):print("創建訂單,等待支付")return PaidState()class PaidState(OrderState):def next_state(self):print("訂單已支付,等待發貨")return ShippedState()class ShippedState(OrderState):def next_state(self):print("訂單已發貨,等待簽收")return CompletedState()class OrderContext:def __init__(self):self._state = CreatedState()def next(self):self._state = self._state.next_state()# 客戶端調用
order = OrderContext()
order.next()  # 創建訂單,等待支付
order.next()  # 訂單已支付,等待發貨

三、狀態機典型應用場景

  1. 訂單生命周期管理
    電商訂單的創建→支付→發貨→完成→退貨等狀態流轉
  2. 硬件設備控制
    自動售貨機投幣→選擇商品→出貨→找零流程
  3. 游戲角色行為
    玩家狀態的切換:站立→奔跑→跳躍→攻擊
  4. 網絡協議處理
    TCP連接的狀態轉換:SYN_SENT → ESTABLISHED → FIN_WAIT

四、狀態機設計最佳實踐

  1. 繪制狀態轉移圖
    編碼前用UML圖明確狀態與事件的關系
  2. 避免狀態爆炸
    當狀態超過10個時,考慮引入??分層狀態機(HFSM)?? 嵌套子狀態
  3. 分離狀態邏輯與業務邏輯
    狀態類僅處理流轉規則,業務數據通過上下文傳遞
  4. 優先選擇聲明式框架
    transitions庫,比手動實現更易維護

五、總結:何時該用狀態機?

當你的系統符合以下特征時:

  • 存在超過3個互斥狀態
  • 狀態轉換規則明確但復雜
  • 新增狀態會導致代碼頻繁修改

狀態機通過解耦狀態與行為,將混亂的條件分支轉化為清晰的狀態轉移表,讓代碼像齒輪一樣精密運轉??。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87245.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python打卡Day41】簡單CNN@浙大疏錦行

可以看到即使在深度神經網絡情況下,準確率仍舊較差,這是因為特征沒有被有效提取----真正重要的是特征的提取和加工過程。MLP把所有的像素全部展平了(這是全局的信息),無法布置到局部的信息,所以引入了卷積神…

MySQL中InnoDB存儲引擎底層原理與MySQL日志機制深入解析

MySQL的內部組件結構如下: 大體來說,MySQL 可以分為 Server 層和存儲引擎層兩部分。 Server層 主要包括連接器、查詢緩存、分析器、優化器、執行器等,涵蓋 MySQL 的大多數核心服務功能,以及所有的內置函數(如日期、…

MCP基本概念

基本概念 現在大模型交互的熱門形式: 第一、Agent與Tools(工具)的交互Agent需要調用外部工具和APl、訪問數據庫、執行代碼等。> MCP 第二、Agent與Agent(其他智能體或用戶)的交互Agent需要理解其他Agent的意圖、協同完成任務、與用戶進行自然的對話。 > A2A…

Docker容器相關命令介紹和示例

Docker 容器是鏡像的運行實例。以下是常用的 Docker 容器命令及其示例&#xff1a; 1. 運行容器 docker run [選項] <鏡像名> [命令]常用選項&#xff1a; -d&#xff1a;后臺運行&#xff08;守護模式&#xff09;-it&#xff1a;交互式終端--name&#xff1a;指定容…

【Akshare】高效下載股票和ETF數據

在量化投資與金融數據分析的世界里&#xff0c;獲取高質量的市場數據是構建有效策略的關鍵。Python庫Akshare為我們提供了一個強大且易于使用的接口&#xff0c;可以輕松地從網絡上抓取各類金融數據。本文將詳細介紹如何利用Akshare下載股票和ETF的歷史行情數據。 安裝Akshare…

分布式--3--分布式事務

1 簡介 事務在單系統中的表現&#xff1a;多次數據庫操作用事務進行管理&#xff0c;來保證ACID原則。 但是如果各個模塊都是單獨獨立出來的微服務&#xff0c;進行了分布式部署&#xff0c;單系統里的事務將不能保證各個數據庫操作的一致性&#xff0c;因此就需要分布式事務來…

不同建模方式的介紹 RTL建模筆記(1)

說明&#xff1a;該專欄"RTL建模筆記"是《RTL Modeling with SystemVerilog for Simulation and Synthesis》的翻譯&#xff1b;該筆記略過了第一章第一小節中背景介紹內容&#xff0c;以及第二小節前面部分的門級、RTL級建模介紹&#xff0c;對于后續學習不影響。 …

<13>-MySQL用戶管理

目錄 一&#xff0c;用戶管理操作 1&#xff0c;創建用戶 2&#xff0c;查詢用戶 3&#xff0c;修改密碼 4&#xff0c;刪除用戶 二&#xff0c;數據庫權限 1&#xff0c;用戶授權 2&#xff0c;回收權限 一&#xff0c;用戶管理操作 1&#xff0c;創建用戶 --創建用戶…

如何使用超低噪聲電源提高AD 時鐘電路質量,改善超聲系統的圖像質量

超聲波技術是醫療診斷和其他應用中廣泛使用的無創工具&#xff0c;已經從靜態圖像進化到動態圖像&#xff0c;從黑白呈現變為彩色多普勒圖像。這些重大進步主要是由于引入了數字超聲技術。雖然這些進步提高了超聲成像的有效性和通用性&#xff0c;但同樣重要的是&#xff0c;這…

【解決方案】Kali 2022.3修復倉庫密鑰一鍵安裝docker,docker compose

1、Kali 2022.3 2、一鍵安裝docker&#xff0c;docker compose #!/bin/bashecho " 安全的Kali Docker安裝腳本 "# 備份重要配置 cp /etc/apt/sources.list /etc/apt/sources.list.backup.$(date %Y%m%d)# 修復Kali倉庫配置 echo "修復Kali倉庫配置..." ca…

Transformer、RNN (循環神經網絡) 和 CNN (卷積神經網絡)的區別

我們來詳細對比一下 Transformer、RNN (循環神經網絡) 和 CNN (卷積神經網絡) 這三種在深度學習中極其重要的架構&#xff0c;并通過具體例子說明它們的區別。 核心區別總結&#xff1a; 處理數據的方式&#xff1a; CNN: 專注于局部特征和空間/時間模式。通過卷積核在輸入數據…

408第二季 - 組成原理 - 數據類型轉換

這章內容會比較少 閑聊 如果題目說把8位改成4位&#xff0c;你保留低位就行了 這里保留的是0101 然后是有符號數和無符號數的轉換 機器數就是二進制長什么樣子 然后就是小數點是不參與存儲的 然后簡單看看代碼 這是short就說明是有符號數 unsigned就是說明是無符號數 然后y…

讓 Deepseek 寫電器電費計算器(html版本)

以下是一個簡單的電器電費計算器的HTML和CSS代碼&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

react_flow自定義節點、邊——使用darg布局樹狀結構

文章目錄 ?前言?引入react-flow?自定義節點nodeType?自定義邊edgeType?添加節點?inscode代碼塊?結束 ?前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端 ——react_flow自定義節點、邊——使用darg布局樹狀結構。 自定義效果 可以自定義節點、邊、線條流動…

word表格批量轉excel,提取表格數據到excel

本文將帶你一步步實現一個將 Word 中的表格內容批量提取并轉換為 Excel 文件的自動化工具&#xff0c;適用于需要手動復制粘貼數據到excel的場景 假設我們有這樣的表格在word中&#xff0c;圖片世放在excel中便于截圖&#xff0c;現在需要將表格中有顏色的數據提取到對應的exce…

day2課程

1.添加pinia到Vue項目 2.counter基礎使用 3.getters和異步action 4.storeToRefs和調試 5.項目初始化和git管理 6.別名路徑聯想設置 7.elementsPlus自動按需導入配置 這個項目使用的是按需引入 1.安裝包管理器 npm install element-plus --save 2.按需引入 npm install -D unp…

Vue3 + TypeScript + Element Plus 設置表格行背景顏色

技術要點&#xff1a; 1、使用 :row-class-name"setRowClassName" 設置表格行類名 2、不能同時使用 stripe 3、設置行類名的樣式 應用效果&#xff1a; 同時使用 stripe 出來的效果&#xff1a; 參考代碼&#xff1a; ReagentTable.vue <script setup lang&…

山東大學 軟件項目管理知識點總結

軟件項目管理背誦總結 將老師所發ppt的知識點整理&#xff0c;方便查閱與背誦。 文章目錄 軟件項目管理背誦總結1. 概述1.1 什么是項目&#xff1f;1.2 項目有那些特征&#xff1f;1.3 項目于日常工作有什么區別&#xff1f;1.4 如何衡量一個項目是否成功&#xff1f;1.5 軟件項…

css基礎筆記簡潔版1

&#x1f4d8; CSS 基礎筆記 1 一、CSS 簡介 CSS&#xff08;層疊樣式表&#xff09;用于為網頁添加樣式&#xff0c;實現結構與樣式分離&#xff0c;能夠控制顏色、字體、布局、位置、動畫等視覺效果。 二、基本語法 選擇器 {屬性1: 值1;屬性2: 值2; }說明&#xff1a; 選…

reactor模型學習

學習鏈接 狂野架構師第四期netty視頻 - B站視頻 狂野架構師訓練營6期 - B站視頻 Netty學習example示例&#xff08;含官方示例代碼&#xff09; LG-Netty學習 【硬核】肝了一月的Netty知識點 - 啟動過程寫的很詳細 Reactor模型講解 一文搞懂Reactor模型與實現 高性能網絡編…