應用場景:在我們日常開發中經常會遇到各種狀態的切換,例如電商系統的訂單狀態。如果我們將各種狀態分散於各個地方,這樣一來不利於管理,二來一旦出現問題很難查詢原因和修復,並且往往很容易出現各式各樣的bug,和控制的不嚴謹。 這個時候,我們就需要使用狀態機模式來合理的控制訂單狀態的驗證,處理和變更。
示例環境:php框架yaf,實際可用於其他各種環境
話不多說,首先我們直接上**,來實現乙個最簡單的狀態機模式:
class order_orderflowservice
//狀態機分發處理
private static function dispatch($status, $data)
return $$result;
}//各自功能實現
private static function createneworder($data)
private static function orderpayed($data)
private static function orderdelivery($data)
private static function orderreceived($data)
private static function ordercomplete($data)
}
首先我們定義五種訂單狀態的預設字段,用於方便使用。然後編寫統一入口方法changestatus。在這個方法裡面,我們可以做一下統一的處理和許可權驗證,以上的示例中省略。統一入口呼叫分發機制匹配相應的方法來處理相應的工作。在這個地方,我們可以根據業務需要,擴大狀態機方法的功能,可以在分發匹配的邏輯上對狀態校驗或者資料處理,也可以把校驗放到具體的業務方法中。
相關資源:
設計模式之狀態模式 狀態機的實現原理
狀態模式是根據狀態的改變觸發一些動作或者行為。當乙個物件的內在狀態改變時可以改變其行為,這個物件看起來像是改變了其類。狀態模式主要有三部分狀態 事件 動作。通過一些事件會觸發狀態的改變,狀態的改變有時候也會出發一些動作。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的...
設計模式 狀態模式(有限狀態機)
狀態模式適用的情況 乙個context物件根據其所處的狀態改變其行為。在狀態模式中,我們通過建立不同的state物件來表示不同的狀態,而context物件則根據不同的state物件表現出不同的行為。狀態模式將不同的狀態結構化,以避免過多的 if else 和 switch case 等樣版 用設計模...
設計模式(三)狀態機
狀態模式 主要解決某個物件具有不同的狀態,根據狀態的不同具有不同的行為。狀態的變化影響這物件的行為的問題。例如航空訂票,機票有不同的狀態,根據不同的狀態 已登機,未登機,起飛前24小時 決定機票的行為 可退票,可改簽等 又例如銀行卡的餘額流水決定者使用者可存款,可借款,可借款金額。又例如工作流審批過...