【設計模式C#】狀態模式(用于解決解耦多種狀態之間的交互)

一種行為設計模式。

特點是用類的方式去管理狀態。

優點:

  1. 對每個狀態進行了封裝,提高了代碼的可維護性;
  2. 減少了條件判斷語句的使用,降低維護成本;
  3. 易于擴展,每次新增狀態都無需大規模修改其他類,符合開閉原則;

缺點:

  1. 會導致類的增加,每個狀態都會是一個單獨的類;
  2. 增加了性能的開銷,狀態的實例化會導致性能消耗增加。

用途:

  1. 設計游戲中人物的狀態
  2. 設計網絡連接時的狀態
  3. 設計訂單的狀態

主要組成部分:

狀態的接口:它定義了每個狀態的實現規則。

每個狀態的具體實現類:定義了狀態的具體的實現邏輯和切換邏輯。

上下文(或者叫控制器):維護一個具體狀態的引用,通常是指調用狀態對象。

實例:

//狀態的接口
using UnityEngine;/// <summary>
/// 每個場景的狀態接口類
/// </summary>
public abstract class ISceneState
{   private string mSceneName;//場景名稱protected SceneStateController mController;//場景狀態控制器public ISceneState(string sceneName, SceneStateController controller){mSceneName = sceneName;mController = controller;}public string SceneName{get { return mSceneName; }}/// <summary>/// 狀態開始時調用/// </summary>public virtual void StateStart() { }/// <summary>/// 狀態結束時調用/// </summary>public virtual void StateEnd() { }/// <summary>/// 狀態更新時調用/// </summary>public virtual void StateUpdate() { }
}
//狀態的實現類
using UnityEngine;
using UnityEngine.UI;public class StartState: ISceneState
{public StartState(SceneStateController controller) :base("01StartScene", controller){}private Image mLOGO;private float mSmoothingTime = 1f;//LOGO過渡時間private float mWaitTime = 2f;//進入MainMenue前等待時間public override void StateStart(){mLOGO = GameObject.Find("Canvas/LOGO").GetComponent<Image>();mLOGO.color = Color.black;}public override void StateUpdate(){//LOGO圖片的緩沖過渡mLOGO.color = Color.Lerp(mLOGO.color, Color.white, mSmoothingTime * Time.deltaTime);//等待時間mWaitTime -= Time.deltaTime;//LOGO圖片的緩沖過渡if(mWaitTime <= 0){mController.SetState(new MainMenuState(mController));}}
}
//狀態的實現類
using UnityEngine;
using UnityEngine.UI;public class MainMenuState: ISceneState
{public MainMenuState(SceneStateController controller): base("02MainMenuScene", controller){}public override void StateStart(){GameObject.Find("Canvas/StartButton").GetComponent<Button>().onClick.AddListener(StartGameButtonOnClick);}public void StartGameButtonOnClick(){mController.SetState(new BattleState(mController));}
}
//狀態的實現類
public class BattleState: ISceneState
{public BattleState(SceneStateController controller): base("03BattleScene", controller){}public override void StateStart(){GameFacade.Instance.Init();}public override void StateEnd(){GameFacade.Instance.Release();}public override void StateUpdate(){   if(GameFacade.Instance.isGameOver){mController.SetState(new MainMenuState(mController));}GameFacade.Instance.Update();}
}
//上下文(或者叫控制器):
using UnityEngine;
using UnityEngine.SceneManagement;public class SceneStateController
{private ISceneState mState;//當前場景狀態private AsyncOperation mAO;//異步加載場景private bool mIsRunStart = false;//表示場景是否已經正在運行中/// <summary>/// 設置場景狀態/// </summary>/// <param name="state">狀態</param>/// <param name="isLoadScene">是否加載場景</param>public void SetState(ISceneState state, bool isLoadScene = true){   //退出狀態時的處理if(mState != null){mState.StateEnd();}//設置新狀態mState = state;//加載場景if(isLoadScene){mAO = SceneManager.LoadSceneAsync(mState.SceneName);mIsRunStart = false;}else{mState.StateStart();mIsRunStart = true;}}/// <summary>/// 更新場景狀態/// </summary>public void StateUpdate(){if (mAO != null && mAO.isDone == false) return;if(mIsRunStart == false && mAO != null && mAO.isDone == true){mState.StateStart();mIsRunStart = true;}if(mIsRunStart && mState != null){mState.StateUpdate();}}
}

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

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

相關文章

WebSocket數據通過splice保持現有DOM結構僅更新文本內容?【防閃爍】。

文章目錄 前言 一、DOM更新優化機制 ?1.虛擬DOM復用性 2.?響應式系統觸發 二、性能對比 三、WebSocket場景實踐 ?1.防閃爍原理 2.代碼實現示例 四、特殊注意事項 總結 前言 開發過程中渲染websocket返回的數據時&#xff0c;經常會遇到更新數據閃爍的問題&#xff0c;咱們可…

深入解析Hadoop的Block多副本同步機制與Pipeline復制

Hadoop分布式文件系統概述作為Hadoop生態的核心存儲組件&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;的設計哲學源于Google File System論文&#xff0c;其架構專門針對大規模數據集處理場景進行了優化。在理解Block多副本同步機制之前&#xff0c…

洪水預報中的序列到序列模型及其可解釋性擴展

洪水預報中的序列到序列模型及其可解釋性擴展 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 1. 引言 洪水預報是水文科學和災害管理中的重要課題&#xff…

UniApp 優化實踐:使用常量統一管理本地存儲 Key,提升可維護性

在 UniApp 項目開發中&#xff0c;隨著功能的增加&#xff0c;本地存儲&#xff08;如 uni.setStorageSync&#xff09;的使用頻率也會增加。如果直接在代碼中硬編碼 key 值&#xff0c;不僅容易出錯&#xff0c;也難以后期維護。本文將以“自定義導航欄適配狀態欄高度”為例&a…

計算機網絡:(八)網絡層(中)IP層轉發分組的過程與網際控制報文協議 ICMP

計算機網絡&#xff1a;&#xff08;八&#xff09;網絡層&#xff08;中&#xff09;IP層轉發分組的過程與網際控制報文協議 ICMP前言一、IP層轉發分組的過程第一步&#xff1a;接收數據包并解封裝第二步&#xff1a;提取目標 IP 地址第三步&#xff1a;查詢路由表第四步&…

Python爬蟲實戰:研究concurrent-futures庫相關技術

1. 引言 1.1 研究背景與意義 網絡爬蟲作為互聯網數據采集的重要工具,在信息檢索、輿情分析、學術研究等領域具有廣泛應用。隨著互聯網數據量的爆炸式增長,傳統單線程爬蟲的效率已難以滿足需求,并發爬蟲技術成為研究熱點。 1.2 相關工作 現有爬蟲框架如 Scrapy、Beautifu…

Neo4j 框架 初步簡單使用(基礎增刪改查)

Neo4j 是一個高性能的、開源的圖數據庫。它將數據存儲為圖結構&#xff0c;其中節點表示實體&#xff0c;邊表示實體之間的關系。這種圖數據模型非常適合處理復雜的關系型數據&#xff0c;能夠高效地進行關系查詢和遍歷。 Neo4j 的主要特性包括&#xff1a; 強大的圖查詢語言 C…

【iOS】鎖[特殊字符]

文章目錄前言1??什么是鎖&#x1f512;&#xff1f;1.1 基本概念1.2 鎖的分類2??OC 中的常用鎖2.1 OSSpinLock&#xff08;已棄用&#xff09;&#xff1a;“自旋鎖”的經典代表為什么盡量在開發中不使用自旋鎖自旋鎖的本質缺陷&#xff1a;忙等待&#xff08;Busy Waiting…

在easyui中如何設置自帶的彈窗,有輸入框

這個就是帶input的確認彈框&#xff08;$.messager.prompt&#xff09;// 使用prompt并添加placeholder提示 $.messager.prompt(確認, 確定要將事故記錄標記為 statusText 嗎&#xff1f;, function(r) {if (r) {// r 包含用戶輸入的內容var remark r.trim();// 驗證輸入不為…

Android-API調用學習總結

一、Postman檢查API接口是否支持1.“HTTP Request” 來創建一個新的請求。——請求構建界面&#xff0c;這是你進行所有 API 調用的地方。2.設置請求方法和 URL&#xff1a;選擇請求方法&#xff1a; 在 URL 輸入框左側&#xff0c;有一個下拉菜單。點擊它&#xff0c;選擇你想…

《計算機網絡》實驗報告一 常用網絡命令

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 3.1 ping基本用法 3.2 ifconfig/ipconfig基本用法 3.3 traceroute/tracert基本用法 3.4 arp基本用法 3.5 netstat基本用法 4、實驗結果與分析 4.1 ping命令的基本用法 4.2 ifconfig/ipconfig命令的基本用法 4.3 tracer…

MySQL深度理解-深入理解MySQL索引底層數據結構與算法

1.引言在項目中會遇到各種各樣的慢查詢的問題&#xff0c;對于千萬級的表&#xff0c;如果使用比較笨的查詢方式&#xff0c;查詢一條SQL可能需要幾秒甚至幾十秒&#xff0c;如果將索引設置的比較合理&#xff0c;可以將查詢變得仍然非常快。2.索引的本質索引&#xff1a;幫助M…

Django母嬰商城項目實踐(九)- 商品列表頁模塊

9、商品列表頁模塊 1、業務邏輯 商品模塊分為:商品列表頁 和 商品詳情頁 商品列表頁將所有商品按照一定的規則排序展示,用于可以從銷量、價格、上架時間和收藏數量設置商品的排序方式,并且在商品左側設置分類列表,選擇某一個分類可以篩選出對應的商品信息。 商品列表頁…

8、STM32每個系列的區別

1、F1和F4的系列的區別 F1采用Crotex M3內核&#xff0c;F4采用Crotex M4內核。F4比F1的主頻高。F4具有浮點數運算單元&#xff0c;F1沒有浮點單元。F4的具備增強的DSP指令集。F407的執行16位DSP指令的時間只有F1的30%~70%。F4執行32位DSP指令的時間只有F1的25% ~ 60%。F1內部S…

DeepSPV:一種從2D超聲圖像中估算3D脾臟體積的深度學習流程|文獻速遞-醫學影像算法文獻分享

Title題目DeepSPV: A deep learning pipeline for 3D spleen volume estimation from 2Dultrasound imagesDeepSPV&#xff1a;一種從2D超聲圖像中估算3D脾臟體積的深度學習流程01文獻速遞介紹1.1 臨床背景 脾腫大指脾臟增大&#xff0c;是多種潛在疾病的重要臨床指標&#x…

病歷數智化3分鐘:AI重構醫院數據價值鏈

一、方案概述本方案針對某省醫聯體醫院病例數據管理需求&#xff0c;通過AI技術實現病歷數字化→信息結構化→數據應用化的全流程改造。系統采用雙端協同架構&#xff1a; - 普通用戶端&#xff1a;為一線醫護人員提供病歷拍攝、AI識別修正、安全上傳功能 - 管理員后臺&#…

CSS+JavaScript 禁用瀏覽器復制功能的幾種方法

&#x1f6e1;? 禁用瀏覽器復制功能完整指南 網頁中禁用用戶的復制功能&#xff0c;包括 CSS 方法、JavaScript 方法、綜合解決方案以及實際應用場景。適用于需要保護內容版權、防止惡意爬取或提升用戶體驗的場景。 &#x1f4cb; 目錄 &#x1f680; 快速開始&#x1f3a8…

Java 虛擬線程在高并發微服務中的實戰經驗分享

Java 虛擬線程在高并發微服務中的實戰經驗分享 虛擬線程&#xff08;Virtual Threads&#xff09;作為Java 19引入的預覽特性&#xff0c;為我們在高并發微服務場景下提供了一種更輕量、易用的并發模型。本文結合真實生產環境&#xff0c;講述在Spring Boot微服務中引入和使用虛…

《拆解WebRTC:NAT穿透的探測邏輯與中繼方案》

WebRTC以其無需插件的便捷性&#xff0c;成為連接全球用戶的隱形橋梁。但很少有人知曉&#xff0c;每一次流暢的視頻對話背后&#xff0c;都藏著一場與網絡邊界的無聲博弈——NAT&#xff0c;這個為緩解IPv4地址枯竭而生的技術&#xff0c;既是網絡安全的屏障&#xff0c;也是端…

前端開發 React 組件優化

1. 使用 React.memo 進行組件優化問題&#xff1a;當父組件重新渲染時&#xff0c;子組件也會重新渲染&#xff0c;即使它的 props 沒有變化。解決方案&#xff1a;使用 React.memo 包裹子組件&#xff0c;讓其只在 props 變化時才重新渲染。示例場景&#xff1a;展示一個顯示計…