C#設計模式-狀態模式

狀態模式案例解析:三態循環燈的實現

?案例概述

本案例使用?狀態模式(State Pattern)?實現了一個?三態循環燈?的功能。每點擊一次按鈕,燈的狀態會按順序切換(狀態1 → 狀態2 → 狀態3 → 狀態1...),并在每次切換時彈出一個消息框顯示當前狀態。此外,還提供了?重置?功能,可以將燈的狀態恢復到初始值。

Light類實現

public class Light
{public LightStateInterface Lightstate { get; set; } // 當前狀態public Light(){Lightstate = new OnLight1(); // 初始狀態為 OnLight1}public void Set(){Lightstate.btn_切換(this); // 調用當前狀態的切換方法}public void reset(){Lightstate = new OnLight1(); // 重置為初始狀態}
}

燈狀態接口定義:

public interface LightStateInterface
{void btn_切換(Light mylight); // 切換狀態的方法
}

OnLight1(狀態1)

class OnLight1 : LightStateInterface
{public void btn_切換(Light mylight){System.Windows.Forms.MessageBox.Show("燈-1"); // 顯示當前狀態mylight.Lightstate = new OnLight2(); // 切換到狀態2}
}

OnLight2(狀態2)

class OnLight2 : LightStateInterface
{public void btn_切換(Light mylight){System.Windows.Forms.MessageBox.Show("燈-2"); // 顯示當前狀態mylight.Lightstate = new OnLight3(); // 切換到狀態3}
}

OnLight3(狀態3)

class OnLight3 : LightStateInterface
{public void btn_切換(Light mylight){System.Windows.Forms.MessageBox.Show("燈-3"); // 顯示當前狀態mylight.Lightstate = new OnLight1(); // 切換回狀態1}
}

winform調用案例:

在 WinForm 界面上提供?切換?和?重置?按鈕,代碼:

    public partial class Form1 : Form{public Form1(){InitializeComponent();}Light light = new Light(); // 創建 Light 對象private void btn_切換燈_Click(object sender, EventArgs e){light.Set(); // 切換狀態}private void btn_重置_Click(object sender, EventArgs e){light.reset(); // 重置狀態}}

狀態模式的核心思想

(1)狀態模式的定義

狀態模式是一種?行為型設計模式,允許對象在?內部狀態改變時改變其行為,看起來像是修改了它的類。

(2)狀態模式的優點

  • 符合開閉原則:新增狀態時無需修改現有代碼,只需新增類。

  • 消除復雜條件語句:避免?if-else?或?switch-case?判斷狀態。

  • 狀態轉換邏輯清晰:每個狀態類負責自己的轉換邏輯。

(3)適用場景

  • 對象的行為取決于它的狀態,并且需要在運行時動態切換。

  • 代碼中包含大量與狀態相關的條件語句時,可以用狀態模式優化。

?

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

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

相關文章

Mac系統升級node.js版本和npm版本并安裝pnpm

1.升級node.js版本 第一步:查詢當前node.js版本 node -v第二步:清除node.js的緩存 sudo npm cache clean -f第三步:驗證緩存是否清空 npm cache verify第四步:安裝n工具,n工具是專門用于管理node.js版本的工具 su…

[net 5] udp_dict_server 基于udp的簡單字典翻譯(服務器與業務相分離)

目錄 1. 功能了解 1.1. 啥是 dic_server? 1.2. dic_server 的小目標 2. 基本框架 2.1. 基本文件框架 2.2. 業務與服務器解耦 -> 回調函數 3. 字典 3.1. 字典配置文件 3.2. 構建字典類 3.2.1. 字典類的基本成員 3.2.2. 字典類構造 3.2.2.1. 構造 3.2.2.2. 信息加…

七種驅動器綜合對比——《器件手冊--驅動器》

九、驅動器 名稱 功能與作用 工作原理 優勢 應用 隔離式柵極驅動器 隔離式柵極驅動器用于控制功率晶體管(如MOSFET、IGBT、SiC或GaN等)的開關,其核心功能是將控制信號從低壓側傳輸到高壓側的功率器件柵極,同時在輸入和輸出之…

EM儲能網關ZWS智慧儲能云應用(8) — 電站差異化支持

面對不同項目、種類繁多的儲能產品,如何在儲能云平臺上進行電站差異化支持尤為關鍵,ZWS智慧儲能云從多方面支持儲能電站差異化。 簡介 隨著行業發展,市場“內卷”之下,各大儲能企業推陳出新的速度加快。面對不同項目、種類繁多…

圖像預處理-色彩空間補充,灰度化與二值化

一.圖像色彩空間轉換 1.1 HSV顏色空間 HSV顏色空間使用色調(Hue)、飽和度(Saturation)和亮度(Value)三個參數來表示顏色 一般對顏色空間的圖像進行有效處理都是在HSV空間進行的,然后對于基本…

Midnight Flag CTF 2025

周末還是三個比賽,可惜不好弄。不是遠端連不上就是遠端打不開。再有就是太難了。 Crypto ABC 這個題還是不算難的。給了兩個30位數的平方和,并且pu1*baser0,qu2*baser1其中r 都很小,可以copper。 只是sage里的two_squres不管用&#xff0…

深度學習--激活函數

激活函數通過計算加權和并加上偏置來確定神經元是否應該倍激活,它們將輸入信號轉換為輸出的可微運算。大多數激活函數都是非線性的,由于激活函數是深度學習的基礎,下面簡要介紹一些常見的激活函數。 1 RelU函數 最受歡迎的激活函數是修正線性…

深入解析 OrdinalEncoder 與 OneHotEncoder:核心區別與實戰應用

標題:深入解析 OrdinalEncoder 與 OneHotEncoder:核心區別與實戰應用 摘要: 本文詳細探討了機器學習中類別特征編碼的兩種核心方法——OrdinalEncoder 和 OneHotEncoder。通過對比兩者的功能、特點、適用場景及代碼實現,幫助讀者…

CTF web入門之命令執行 完整版

web29 文件名過濾 由于flag被過濾,需要進行文件名繞過,有以下幾種方法: 1.通配符繞過 fla?.* 2.反斜杠繞過 fl\ag.php 3.雙引號繞過 fl’‘ag’.php 還有特殊變量$1、內聯執行等 此外 讀取文件利用cat函數,輸出利用system、passthru 、echo echo `nl flag.php`; ec…

【Linux實踐系列】:用c/c++制作一個簡易的進程池

🔥 本文專欄:Linux Linux實踐項目 🌸作者主頁:努力努力再努力wz 💪 今日博客勵志語錄: 人生沒有標準答案,你的錯題本也能寫成傳奇。 ★★★ 本文前置知識: 匿名管道 1.前置知識回顧…

2.2 函數返回值

1.回顧def def sum(x,y): return xy res sum(10,20) #調用函數 print(res) 2.函數的三個重要屬性 -函數的類型:function -函數的ID:16進制的整數數值 -函數的值:封裝在函數中的數據和代碼 # - 函數是一塊內存空間,通過…

【3GPP核心網】【5G】精講5G網絡語音業務系統架構

1. 歡迎大家訂閱和關注,精講3GPP通信協議(2G/3G/4G/5G/IMS)知識點,專欄會持續更新中.....敬請期待! 目錄 1. 音視頻業務 2. 消息類業務 SMS over IMS SMS over NAS 3. 互聯互通架構 3.1 音視頻業務互通場景 3.2 5G 用戶與 5G 用戶互通 3.3 5G 用戶與 4G 用戶的互通…

系統環境變量有什么實際作用,為什么要配置它

系統環境變量有什么實際作用,為什么要配置它 系統環境變量具有以下重要實際作用: 指定程序路徑:操作系統通過環境變量來知曉可執行文件、庫文件等的存儲位置例如,當你在命令提示符或終端中輸入一個命令時,系統會根據環境變量PATH中指定的路徑去查找對應的可執行文件。如果…

qt/C++面試題自用學習(更新中)

最近在找工作…面試中遇到了的問題總以為自己會但回答的時候磕磕巴巴,覺得還是要總結一下: vector和list的區別 vector list 底層數據結構 基于動態數組實現,元素在內存中連續存儲 基于雙向鏈表實現,元素在內存中非連續存儲&…

Day09【基于Tripletloss實現的簡單意圖識別對話系統】

基于Tripletloss實現的表示型文本匹配 目標數據準備參數配置數據處理Triplet Loss目標Triplet Loss計算公式公式說明 模型構建網絡結構設計網絡訓練目標損失函數設計 主程序推理預測類初始化加載問答知識庫文本向量化知識庫查詢主程序main測試測試效果 參考博客 目標 在此之前…

說說什么是冪等性?

大家好,我是鋒哥。今天分享關于【說說什么是冪等性?】面試題。希望對大家有幫助; 說說什么是冪等性? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 冪等性(Idempotence) 是指在某些操作或請求…

【自相關】全局 Moran’s I 指數

自相關(Autocorrelation),也稱為序列相關性,指的是同一變量在不同時間或空間點的值之間的關系。簡而言之,自相關就是一個變量與自身在不同位置或時間點的相關性 自相關:針對同一屬性之間進行分析相關性 本…

【C#】Html轉Pdf,Spire和iTextSharp結合,.net framework 4.8

🌹歡迎來到《小5講堂》🌹 🌹這是《C#》系列文章,每篇文章將以博主理解的角度展開講解。🌹 🌹溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!&#…

KrillinAI:視頻跨語言傳播的一站式AI解決方案

引言 在全球內容創作領域,跨語言傳播一直是內容創作者面臨的巨大挑戰。傳統的視頻本地化流程繁瑣,涉及多個環節和工具,不僅耗時耗力,還常常面臨質量不穩定的問題。隨著大語言模型(LLM)技術的迅猛發展,一款名為Krillin…