設計模式之狀態模式 狀態機的實現原理

2021-10-05 21:32:40 字數 1427 閱讀 9162

狀態模式是根據狀態的改變觸發一些動作或者行為。

當乙個物件的內在狀態改變時可以改變其行為,這個物件看起來像是改變了其類。

狀態模式主要有三部分狀態事件動作

通過一些事件會觸發狀態的改變,狀態的改變有時候也會出發一些動作。

狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的狀態判斷邏輯簡化。

對於乙個有各種狀態,並且每種狀態很複雜的就可以使用狀態模式。不過對於狀態來說最先想到的應該是使用if-else來判斷狀態然後執行狀態邏輯吧。

比如物流狀態,假設有打包中運輸中配送中已簽收。當然這個例子比較簡單,沒有那麼複雜的狀態互動。

if

($status

=='打包中'

)elseif(

$status

=='運輸中'

)elseif(

$status

=='配送中'

)elseif(

$status

=='已簽收'

)

這個時候如果要增加乙個狀態就需要修改這個if-else,這裡和業務是強耦合的,修改是很有問題的,那麼使用狀態模式把這些狀態分離出來呢

定義乙個狀態類

abstract

class

state

由於有四個狀態,所以分離出四個狀態類

class

package

extends

state

}class

transport

extends

state

}class

delivery

extends

state

}class

endextends

state

}

接下來有乙個worker類來管理狀態

class

worker

//暴露乙個改變當前狀態的方法

function

setstate

(state $state

)//給客戶端暴露乙個操作狀態的介面,也就是事件,比如發生配送人開始配送了,那麼狀態需要從運輸中改變成配送中

function

change()

}

**放在了我的github上面。

設計模式 狀態模式(有限狀態機)

狀態模式適用的情況 乙個context物件根據其所處的狀態改變其行為。在狀態模式中,我們通過建立不同的state物件來表示不同的狀態,而context物件則根據不同的state物件表現出不同的行為。狀態模式將不同的狀態結構化,以避免過多的 if else 和 switch case 等樣版 用設計模...

狀態機模式

狀態機又叫有限狀態機,它有 3 個部分組成 狀態 事件 動作。其中,事件也稱為轉移條件。事件觸發狀態的轉移及動作的執行。不過,動作不是必須的,也可能只轉移狀態,不執行任何動作。針對狀態機,有三種實現方式。第一種實現方式叫分支邏輯法。利用 if else 或者 switch case 分支邏輯,參照狀...

設計模式(三)狀態機

狀態模式 主要解決某個物件具有不同的狀態,根據狀態的不同具有不同的行為。狀態的變化影響這物件的行為的問題。例如航空訂票,機票有不同的狀態,根據不同的狀態 已登機,未登機,起飛前24小時 決定機票的行為 可退票,可改簽等 又例如銀行卡的餘額流水決定者使用者可存款,可借款,可借款金額。又例如工作流審批過...