狀態(tài)機(jī)在C#上位機(jī)中使用總結(jié)
本以為狀態(tài)機(jī)是很高深的知識(shí),沒(méi)想到在平時(shí)項(xiàng)目中早就用到了。雖然只是最簡(jiǎn)單的使用,但邏輯是相同的,于是就學(xué)習(xí)了一下?tīng)顟B(tài)模式的寫(xiě)法,方便以后在復(fù)雜的項(xiàng)目中使用。
?基本概念
- 狀態(tài)(State)??:系統(tǒng)在特定時(shí)刻所處的狀況或模式
例如上位機(jī)的"停止"、"運(yùn)行"、"暫停"、"緊急停止"等狀態(tài) - ?事件(Event)??:觸發(fā)狀態(tài)轉(zhuǎn)換的輸入或動(dòng)作
例如"啟動(dòng)按鈕按下"、"停止信號(hào)接收"、"急停觸發(fā)"等 - ?轉(zhuǎn)移(Transition)??:從一個(gè)狀態(tài)到另一個(gè)狀態(tài)的變化
通常由事件觸發(fā),可能伴隨特定條件 - ?動(dòng)作(Action)??:狀態(tài)轉(zhuǎn)換時(shí)執(zhí)行的操作
例如"進(jìn)入運(yùn)行狀態(tài)時(shí)啟動(dòng)電機(jī)"、"進(jìn)入急停狀態(tài)時(shí)切斷電源"
只要符合這四個(gè)概念就是狀態(tài)機(jī),最簡(jiǎn)單的就是權(quán)限管理的功能了,軟件上有不同的賬戶,然后不同的賬戶有不同的權(quán)限功能(狀態(tài))。不同的權(quán)限對(duì)應(yīng)的能執(zhí)行的操作不同,比如管理員可以修改參數(shù),操作員不可以(動(dòng)作)。賬戶登錄界面可以切換不同的賬戶登錄(事件)。只有輸入正確的密碼才可以登錄不同的賬戶(轉(zhuǎn)移)。這個(gè)狀態(tài)機(jī)完全可以使用if-else語(yǔ)句來(lái)進(jìn)行判斷實(shí)現(xiàn),建立一個(gè)枚舉來(lái)存儲(chǔ)不同的賬戶類(lèi)型,然后一個(gè)變量存儲(chǔ)著當(dāng)前的賬戶狀態(tài),登錄時(shí)進(jìn)行密碼和賬戶名判斷,如果正確切換不同的賬戶。如果是簡(jiǎn)單的狀態(tài)機(jī)完全可以使用這種方法的,只有3-5個(gè)簡(jiǎn)單狀態(tài)、狀態(tài)轉(zhuǎn)換邏輯非常直接、沒(méi)有復(fù)雜的嵌套子狀態(tài)。這個(gè)方法就是對(duì)應(yīng)這類(lèi)項(xiàng)目最好的解決方案。
除此之外的一些實(shí)現(xiàn)方式
| 實(shí)現(xiàn)方式 | 優(yōu)點(diǎn) | 缺點(diǎn) | 適用場(chǎng)景 |
|---|---|---|---|
| 條件語(yǔ)句(if-else) | 簡(jiǎn)單直觀 | 狀態(tài)多時(shí)代碼臃腫難維護(hù) | 簡(jiǎn)單狀態(tài)機(jī)(3-5個(gè)狀態(tài)) |
| 狀態(tài)模式 | 符合開(kāi)閉原則,易于擴(kuò)展 | 需要?jiǎng)?chuàng)建多個(gè)狀態(tài)類(lèi) | 復(fù)雜狀態(tài)機(jī),需要長(zhǎng)期維護(hù) |
| 狀態(tài)表驅(qū)動(dòng) | 數(shù)據(jù)驅(qū)動(dòng),修改靈活 | 初期設(shè)計(jì)復(fù)雜 | 狀態(tài)轉(zhuǎn)換規(guī)則頻繁變化 |
| 專(zhuān)用框架 | 功能強(qiáng)大,支持復(fù)雜特性 | 學(xué)習(xí)成本高 | 企業(yè)級(jí)復(fù)雜系統(tǒng) |
狀態(tài)模式
//接口
interface 狀態(tài)接口
要實(shí)現(xiàn)的操作1、2、3
//具體的狀態(tài)
class 狀態(tài)1:狀態(tài)接口
操作實(shí)現(xiàn)
class 狀態(tài)2:狀態(tài)接口
操作實(shí)現(xiàn)...
//調(diào)度類(lèi)、上下文類(lèi)
class 控制
接口實(shí)例
當(dāng)前狀態(tài)
切換狀態(tài)1
切換狀態(tài)2...
狀態(tài)模式的出現(xiàn)也是為了解耦,更容易添加新?tīng)顟B(tài),在狀態(tài)大于五個(gè)并且出現(xiàn)層次嵌套的時(shí)候可以使用狀態(tài)模式來(lái)實(shí)現(xiàn)。
無(wú)論如何要遵循的設(shè)計(jì)模式其實(shí)只有一個(gè),一切應(yīng)盡可能簡(jiǎn)單,但不過(guò)分簡(jiǎn)單。沒(méi)有復(fù)雜度就不要復(fù)雜解,不要為了設(shè)計(jì)模式而去設(shè)計(jì)模式,代碼只需要易懂、易改、安全就可以了

浙公網(wǎng)安備 33010602011771號(hào)