設計模式 --- 狀態模式

狀態模式??是一種??行為型設計模式??,允許對象在內部狀態改變時動態改變其行為??,使對象的行為看起來像是改變了。該模式通過將狀態邏輯拆分為獨立類??,消除復雜的條件分支語句,提升代碼的可維護性和擴展性。
狀態模式的核心價值??在于??解耦狀態邏輯與上下文??,為復雜狀態管理提供結構化解決方案。在游戲開發中,它尤其適合管理角色控制、AI行為等動態狀態流轉場景,但需權衡類膨脹和性能成本。

優點:

1. ??消除復雜條件分支:消除大量if-else或switch語句,避免代碼臃腫且難以維護,將每個分支獨立為一個狀態類,通過狀態切換取代條件分支。
2.提高擴展性:新增狀態無需修改上下文類,只需添加新的狀態類即可。
3.職責單一化:每個狀態類僅關注自身行為,符合單一職責原則。
4.狀態轉換顯式管理:狀態轉換條件封裝在狀態類中,避免分散在代碼各處。
5.提高可測試性:每個狀態可單獨測試,無需依賴其他邏輯。

缺點:?

1.類數量增多:每個狀態對應一個類,可能導致類數量過多。(例如10個狀態 → 10個類 + 接口 + 上下文類)
優化:
? ? ? ?1.?使用 ??層級狀態機?? 合并相似狀態(如 BaseMovementState 派生 Walk/Run)。
? ? ? ?2.對簡單狀態使用 ??枚舉 + 委托?? 簡化實現。
2.Context數據共享:狀態類需訪問上下文數據,可能導致過度暴露接口(如Player類需向狀態類公開血量、位置等字段)。
優化:
? ? ? ? 1.將共享數據封裝為 ??上下文接口??,限制訪問權限。
? ? ? ? 2.通過事件/委托通信,減少直接依賴。
3.性能開銷:頻繁創建/銷毀狀態對象可能影響性能(如每幀切換狀態)。
優化:
? ? ? ? ?1.使用??對象池??復用狀態實例。

說明例子:

1.UML類圖:

2.實現:

1.定義State的抽象類:

    public abstract class State{protected Context m_Context = null;public State(Context _context){m_Context = _context;}public abstract void Handler(int value);}

2.定義Context類:

    public class Context{State m_State = null;public void Request(int value){m_State.Handler(value);}public void SetState(State state){Debug.Log("Context.SetState:" + state);m_State = state;}}

3.定義具體狀態類:ConcreteStateA、ConcreteStateB、ConcreteStateC

    public class ConcreteStateA : State{public ConcreteStateA(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateA.Handler");if (value > 10){m_Context.SetState(new ConcreateStateB(m_Context));}}}public class ConcreateStateB : State{public ConcreateStateB(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateB.Handler");if (value > 20){m_Context.SetState(new ConcreateStateC(m_Context));}}}public class ConcreateStateC : State{public ConcreateStateC(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateC.Handler");if (value > 30){m_Context.SetState(new ConcreteStateA(m_Context));}}}

4.測試類:

public class StateParttern : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Context context = new Context();context.SetState(new ConcreteStateA(context));context.Request(5);context.Request(15);context.Request(25);context.Request(35);}
}

游戲中的使用場景:

??1.角色行為管理??:玩家狀態 --> 站立、移動、跳躍、攻擊、死亡。
??2.AI決策系統??:敵人AI --> 巡邏、追擊、攻擊、逃跑。
?3.?UI界面切換??:游戲菜單 --> 主界面、設置、背包、暫停。
4.場景切換:游戲場景 --> 開始場景、大廳場景、戰斗場景切換。
??5.物理交互系統??:物體狀態 --> 靜止、運動、碰撞、銷毀。

總結:

狀態模式的核心價值??在于解耦狀態邏輯與上下文??,為復雜狀態管理提供結構化解決方案。在游戲開發中,它尤其適合管理角色控制、AI行為等動態狀態流轉場景,但需權衡類膨脹和性能成本。

參考書籍:

《Hands-On Game Development Patterns with Unity 2019》

《設計模式與游戲完美開發》

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

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

相關文章

【讀者求助】如何跨行業進入招聘崗位?

文章目錄 讀者留言回信崗位細分1. 中介公司的招聘崗位2. 獵頭專員3. 公司的招聘專員選擇建議 面試建議1. 請簡單介紹你過去 3 年的招聘工作經歷,重點說下你負責的崗位類型和規模2. 你在招聘流程中最常用的渠道有哪些?如何評估渠道效果?3. 當你…

AI Agent入門指南

圖片來源網絡 ?一、開箱暴擊:你以為的"智障音箱",其實是賽博世界的007? ?1.1 從人工智障到智能叛逃:Agent進化史堪比《甄嬛傳》? ?青銅時代(2006-2015)? “小娜同學,關燈” “抱歉&…

pnpm 中 Next.js 模塊無法找到問題解決

問題概述 項目在使用 pnpm 管理依賴時,出現了 “Cannot find module ‘next/link’ or its corresponding type declarations” 的錯誤。這是因為 pnpm 的軟鏈接機制在某些情況下可能導致模塊路徑解析問題。 問題診斷 通過命令 pnpm list next 確認項目已安裝 Next.js 15.2.…

vulnhub:sunset decoy

靶機下載地址https://www.vulnhub.com/entry/sunset-decoy,505/ 滲透過程 簡單信息收集 nmap 192.168.56.0/24 -Pn # 確定靶機ip:192.168.56.121 nmap 192.168.56.121 -A -T4 # 得到開放端口22,80 在80端口得到save.zip,需要密碼解壓。 john破解壓縮…

代碼學習總結(一)

代碼學習總結(一) 這個系列的博客是記錄下自己學習代碼的歷程,有來自平臺上的,有來自筆試題回憶的,主要基于 C 語言,包括題目內容,代碼實現,思路,并會注明題目難度&…

OSPF的接口網絡類型【復習篇】

OSPF在不同網絡環境下默認的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的網絡類型網絡類型OSPF接口的網絡類型(工作方式)計時器BMA(以太網)broadcast ,需要DR/BDR的選舉hello:10s…

PHM學習軟件|PHM預測性維護系統

使用步驟教程如下 1、登錄 用戶名:52phm 密碼:xxx (區別在于不同用戶密鑰不一樣) 2、上傳需要分析的數據集 支持數據集格式:csv、xlsx、xls、mat、json 3、主題1:機械參數計算 計算軸承、齒輪、皮帶的…

MySQL MVCC 機制詳解

MySQL MVCC 機制詳解 1. MVCC 基本概念 MVCC 是一種并發控制的方法,主要用于數據庫管理系統,允許多個事務同時讀取數據庫中的同一個數據項,而不需要加鎖,從而提高了數據庫的并發性能。 ┌──────────────────…

Model Context Protocol (MCP) - 嘗試創建和測試一下MCP Server

1.簡單介紹 MCP是Model Context Protocol的縮寫,是Anthropic開源的一個標準協議。MCP使得大語言模型可以和外部的數據源,工具進行集成。當前MCP在社區逐漸地流行起來了。同時official C# SDK(倉庫是csharp-sdk) 也在不斷更新中,目前最新版本…

(三)行為模式:12、訪問者模式(Visitor Pattern)(C++示例)

目錄 1、訪問者模式含義 2、訪問者模式的UML圖學習 3、訪問者模式的應用場景 4、訪問者模式的優缺點 5、訪問者模式C實現的實例 1、訪問者模式含義 訪問者模式(Visitor Pattern)是一種行為型設計模式,它允許將一個作用于某對象結構中的各…

windows安卓子系統wsa隱藏應用列表的安裝激活使用

Windows 11 安卓子系統應用部署全攻略 windows安卓子系統wsa隱藏應用列表的安裝激活使用|過檢測核心前端 在 Windows 11 系統中,安卓子系統為用戶帶來了在電腦上運行安卓應用的便利。經過一系列的操作,我們已經完成了 Windows 11 安卓子系統的底層和前端…

Elasticsearch 集群搭建

一、集群規劃 1.1 節點角色規劃 節點類型配置要求推薦數量Master節點低磁盤、中等CPU/內存3(奇數防止腦裂)Data節點高磁盤、高內存、多核CPU根據數據量擴展Coordinating節點高CPU/內存、低磁盤2(可選) 1.2 硬件建議 內存&…

React 響應事件

開發環境:Reacttsantd 使用 React 可以在 JSX 中添加 事件處理函數。其中事件處理函數為自定義函數,它將在響應交互(如點擊、懸停、表單輸入框獲得焦點等)時觸發。 學習內容 1.編寫事件處理函數的不同方法 2.如何從父組件傳遞事件…

SQL基礎入門:從CRUD到JOIN再到索引(通俗易懂版)

一、為什么需要SQL? 想象你在管理一個圖書館: 傳統方法:手動記錄每本書的位置、借閱者、歸還日期SQL方法:用數據庫系統自動管理,快速查詢《Java編程思想》在哪個書架 SQL(Structured Query Language&…

MINIQMT學習課程Day11

現在開始進行策略的交易買賣分析: 還是之前的步驟,打開qmt,選擇獨立交易, 之后使用pycharm,編寫py文件 導入包: import time, datetime, traceback, sys from xtquant import xtdata from xtquant.xttr…

# 實時人臉性別與年齡識別:基于OpenCV與深度學習模型的實現

實時人臉性別與年齡識別:基于OpenCV與深度學習模型的實現 在當今數字化時代,計算機視覺技術正以前所未有的速度改變著我們的生活與工作方式。其中,人臉檢測與分析作為計算機視覺領域的重要分支,已廣泛應用于安防監控、智能交互、…

Python Cookbook-5.14 給字典類型增加排名功能

任務 你需要用字典存儲一些鍵和“分數”的映射關系。你經常需要以自然順序(即以分數的升序)訪問鍵和分數值,并能夠根據那個順序檢查一個鍵的排名。對這個問題,用dict 似乎不太合適。 解決方案 我們可以使用 dict 的子類,根據需要增加或者重…

十四種邏輯器件綜合對比——《器件手冊--邏輯器件》

目錄 邏輯器件 簡述 按功能分類 按工藝分類 按電平分類 特殊功能邏輯器件 應用領域 詳盡闡述 1 邏輯門 一、基本概念 二、主要類型 三、實現方式 四、應用領域 2 反相器 工作原理 基本功能 主要應用 常見類型 特點 未來發展趨勢 3 鎖存器 基本概念 工作原理 主要類型…

如何更改wsl2中的ubuntu默認安裝位置

先前的一篇文章提到了如何更改wsl里面ubuntu的home目錄,wsl裝ubuntu的home目錄在哪,如何更改home?_wsl安裝的ubuntu在哪里-CSDN博客 這次是要更改wsl中ubuntu的安裝目錄,畢竟默認安裝到c盤下會占用不少空間的。 從微軟商店get后…

最近在工作中感受到了設計模式的重要性

之前了解設計模式:只是應付一下面試 在之前一年多的工作中也沒遇到使用場景 最近在搭建驗證環境的時候,才發現這玩意這么重要 首先是設計模式的使用場景一定是在很復雜繁瑣的場景下進行的 之所以說是復雜/繁瑣的場景,因為一些場景也許邏輯不難…