狀態模式詳解

概述

結構設計類似責任鏈模式,但是在各個狀態進行遍歷的過程中,更注重的是條件的判斷,只有符合條件的狀態才能正常匹配進行處理。條件不成功的會立即切換到下一個狀態。

有限狀態機

狀態機一般指的是有限狀態機(FSM:finite-state machine),又稱為優先自動狀態機(FSA:finite-state automaton)。

  • 狀態(State)

    狀態機的有限個狀態,例如:門可以分為開啟、關閉兩種狀態。

  • 轉換條件/事件(Transition Condition / Event)

    觸發狀態機的事件。只有收到相應的事件觸發相應條件時候,狀態機才會進行狀態的轉換。

  • 轉換(Transition)

    記錄狀態機進行狀態轉換的多個過程(指定事件可以轉換到指定狀態的關系,可以是多個關系,表示當前狀態可以在觸發不同事件后,可以轉換到多個不同的其他狀態),用來在事件觸發時候進行狀態轉換。

  • 動作(Action)

    在進行狀態切換完成后,要執行的動作。

狀態機分類

根據狀態機的寫法,可以分為三種(主要應用在硬件電路):

  • 一段式:一段式狀態機的缺點就是許多種邏輯糅合在一起,不易后期的維護。
  • 兩段式:
  • 三段式:

根據狀態機的輸出是否與輸入有關系,可以分為兩種:

  • Mealy 狀態機(不僅與當前狀態有關,還取決于當前的輸入事件)
  • Moore 狀態機(只與當前狀態有關,與當前輸入無關)

類圖

Context
- IState state;
+setState(IState)
+rqeust()
?interface?
IState
+void handle(Context)
StopState
+void handle(Context)
RunningState
+void handle(Context)

注意:類圖種狀態的公共接口只有一個 handle(Context),實際使用時候狀態一般都不止一個接口,可能有若干個

關鍵代碼

class Context {private $state;public function __construct() {$this->state = new StopState();}public function setState(IState $state) {$this->state = state;}public function request() {$this->state->handle($this);}
}interface IState {public function handle(Context $context);
}class StopState implements IState {public function handle(Context $context) {// 與其他狀態條件不同.if (...) {echo "stop state ...". PHP_EOL;    } else {$context->setSate(new RunningState());$context->request();}}
}class RunningState implements IState {public function handle(Context $context) {// 與其他狀態不同的條件if (...) {echo "stop state ...". PHP_EOL;    } else {$context->setSate(new RunningState());$context->request();}}
}
// 客戶端代碼.
$context = new Context();
$context->request();

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

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

相關文章

Lua 調試(Debug)

Lua 調試(Debug) 引言 Lua 是一種輕量級的編程語言,廣泛應用于游戲開發、嵌入式系統、腳本編寫等領域。在 Lua 開發過程中,調試是確保程序正確運行的重要環節。本文將詳細介紹 Lua 調試的基本方法、常用工具以及調試技巧,幫助開發者提高編程…

Windows安裝Emscripten?/emsdk(成功)

安裝git安裝python 不要自行下載版本,先卸載其他版本的python。 使用管理員打開cmd,輸入python3,直接跳轉到應用商店,安裝即可。 為什么一定要這么安裝?好像是跟路徑有關。 下載emsdk git clone https://github.c…

AI網頁部署在本地_windows

用bolt.new寫了一個網頁,下載ZIP至本地 以下是在 Windows 上本地運行你用 Node.js 搭建的網頁服務,并在瀏覽器中訪問的常見流程: 1、安裝 Node.js 訪問官網 Node.js — Run JavaScript Everywhere ,下載適合 Windows 的 LTS 版本…

Linux sudo命令

sudo是一個常用的Linux命令,用于以超級用戶的權限執行命令。下面是對sudo命令的介紹: sudo命令的作用: sudo允許普通用戶以超級用戶(root)的身份執行特定命令或訪問特定文件。它提供了一種安全且可控制的方式&#xf…

郵件合并----批量從excel表中導出數據到word中

文章目錄 前言一、操作流程1. 打開word,開始郵件合并->郵件合并分布向導2. 開始郵件合并,一共6步3. 選擇全部,點擊確認,即可生成Excel表中244條記錄,也就是244頁。 總結 前言 涉及到將學生的姓名、學號、檔案編號、…

活動安排貪心算法

輸入說明 n??????—— 活動數量 s[1…n]??— 第 i 個活動的開始時間 (start) f[1…n]??— 第 i 個活動的結束時間 (finish) 前置要求:數組已按 f 從小到大排好序 (若沒排,先調用 sortByFinishTime(),復雜度 O(n log …

Mysql8啟用日志審計插件

概述 等保要求,數據庫啟用日志審計。Mysql8上面使用開源插件audit-plugin-for-mysql(MariaDB的審計插件不用折騰了,無論直接使用還是編譯使用,在Mysql8上都不行) 插件下載 日志審計插件下載地址: https:…

機器學習-線性模型

目錄 線性模型 1、線性回歸: 2、對數幾率回歸: 3、線性判別分析: 4、多分類學習: 5、類別不平衡問題: 基本數理知識補充: 損失函數: 凹凸函數 梯度下降 線性模型 線性模型形式簡單、易…

Git上傳代碼如何解決Merge沖突

示例 解決方案 1、第一步切到本地的主分支 git checkout master2、拉取線上最新的代碼 git pull3、切到本地自己的分支 gco feat-xx4、將代碼從master變基&#xff08;移動/合并&#xff09;過來 git rebase master5、手動解決沖突 <<<<<<< HEAD 本…

fluentd + elasticsearch + grafana 不能顯示問題

fluentd中配置log 源文件后&#xff0c;再配置elasticsearch后&#xff0c; elasticsearch pod中查詢日志記錄正常。 修改log 文件 后&#xff0c; elasticsearch pod中查詢日志記錄更新也正常。 但是在grafana中添加elasticsearch data source后&#xff0c; 連接正常&#…

《分布式事務新形態:AT模式如何被Seata TCC擊穿》的深度解析,包含AT死鎖原理/TCC原子性保障/Service Mesh深度集成三大硬核模塊

一、AT模式的死刑判決&#xff1a;全局鎖引發的血案 1.1 死鎖現場還原&#xff08;支付寶真實案例&#xff09; 1.2 全局鎖原理與缺陷 二、TCC模式的絕地反擊&#xff1a;原子性保障三板斧 2.1 TCC核心架構設計 2.2 冪等控制原子防護網 三、Service Mesh深度集成&#xf…

【Elasticsearch】es初識,在項目架構中的用途,與mysql和kafka的配合使用,

ES是一個開源的高擴展的分布式全文檢索引擎 在項目已有mysql增刪改查的情況下&#xff0c;新增kafka&#xff0c;es流程 用戶新增/修改商家&#xff08;寫MySQL&#xff09; ↓ Kafka 生產者發送商家數據消息 ↓ Kafka 消費者監聽消息 → 寫入 Elasticsearch ↓ 前端搜索商家時…

【DataWhale組隊學習】AI辦公實踐與應用-數據分析

AI辦公&#xff1a;數據分析 1. 使用大模型進行數據分析的常見流程 把數據扔給AI讓AI自動分析&#xff0c;并告訴你結果 下面我們對上面兩個步驟進行詳細說明 2. 使用大模型進行數據分析 2.1 將數據扔給大模型 2.1.1 選擇合適的辦公大模型 要使用大模型進行數據分析時&a…

5G 浪潮:發展全景、困境突圍與未來航向

在當今數字化浪潮中&#xff0c;5G 技術宛如一顆璀璨的明星&#xff0c;照亮了各個行業前行的道路。自 5G 正式商用以來&#xff0c;它不僅深刻改變了人們的生活方式&#xff0c;更在工業、農業、交通等領域掀起了一場數字化轉型的革命。本文將深入探討 5G 技術的原理、發展現狀…

理論加案例,一文讀懂數據分析中的分類建模

一、什么是分類 分類&#xff0c;是數據建模領域的重要分支&#xff0c;你每天也都會接觸。 手機垃圾短信過濾&#xff0c;就是分類算法給短信打的標簽&#xff0c;比如0代表正常短信&#xff0c;1代表垃圾短信。 在醫學領域&#xff0c;根據影像檢查判斷腫瘤是良性還是惡性。…

數組題解——二分查找【LeetCode】

704. 二分查找 算法邏輯分析 初始化邊界 left 設為0&#xff0c;right 設為len(nums)&#xff0c;表示左閉右開區間 [left, right)。這意味著搜索區間包含下標left&#xff0c;但不包含下標right。 循環條件 while left < right:&#xff0c;只要left小于right&#xff0c…

Function AI 工作流發布:以 AI 重塑企業流程自動化

作者&#xff1a;寒斜 在 AI 技術飛速發展的今天&#xff0c;企業的流程自動化方式也正在發生深刻變革。過去&#xff0c;流程自動化往往依賴于人工配置和固定規則&#xff0c;難以適應復雜、多變的業務場景。而如今&#xff0c;隨著 LLM&#xff0c;Agent&#xff0c;MCP 等節…

【單元測試】單元測試的定義和作用

介紹 ?單元測試不僅是對函數進行測試&#xff0c;還包括對類、組件等最小可測試單元的測試?。單元測試是對軟件中的最小可測試單元進行驗證的過程&#xff0c;這些單元可以是函數、方法、類或組件等。單元測試的主要目的是確保這些最小單元在隔離的環境中能夠正確地實現其功…

AI 輔助生成 Mermaid 流程圖

文章目錄 背景Mermaid使用 AI 編寫 Mermaid應用 背景 在 markdown 文檔中雖然可以插入圖片&#xff0c;但是也需要管理圖片&#xff0c;一旦圖片位置變了&#xff0c;文檔中的圖片就無法顯示。圖片占用空間較大&#xff0c;對于在線文檔&#xff0c;為了加載速度&#xff0c;能…

定位坐標系深度研究報告

一、引言 定位坐標系是用于描述地理位置的數學工具&#xff0c;其發展與人類對地球形狀的認知和技術需求密切相關。早期的定位依賴于天文觀測&#xff08;如經緯度&#xff09;&#xff0c;現代則結合衛星技術&#xff08;如GPS&#xff09;和數學投影方法&#xff08;如墨卡托…