1. 狀態結構圖
2. 詳細介紹
我們把狀態機中的對象分為 “狀態對象的持有者” 和 “狀態對象”, 也就是Stateful 和 Status兩類。AbstractStatus 抽象類實現 Status接口主要定義了一個模板transit,在狀態轉換前和狀態轉換后完成一些操作,并且增加了狀態描述,方便記錄當前所在的狀態,比如log到db或者log到文件中。
StatusManager是由很多個全局單例的狀態組成的,這些單例包含了所有StatusMachine中需要用到的狀態,Stateful對象作為函數的參數傳入到status的handleStatus方法中,這樣避免了一個Status對象和Stateful綁定在一起,減少了Status對象的個數,這才可以把它們設計為單例。
3.功能函數介紹
Stateful; 狀態對象的持有者,姑且就把它稱為“有狀態”對象,這個接口描述了“有狀態”對象的行為, getCurrentStatus - 獲取當前有狀態對象的狀態, setCurrentStatus: 改變當前有狀態的對象所持有的狀態, nextStatus:由StatusMachine調用改變“有狀態”對象的狀態。這個接口可以根據不同的應用添加不同的方法,因為狀態對象持有者的行為根據不同應用可變性比較大。
Status: 狀態對象,描述對象的狀態,對象狀態所具備的行為。getStatusDesc:得到狀態的描述符, handleStatus: 處理當前狀態, nextStatus:根據命令將“有狀態”對象改變到下一個狀態, transit:根據命令改變“有狀態”對象的狀態,并在改變前和改變后做一些特殊的操作,比如log, 判斷是否是異常狀態等。
AbstractStatus: 主要加入了描述字符串和異常狀態,并且實現了transit方法,一般流程,如果有不同的transit流程,即需要在之前和之后完成不同的操作,可以在子類中重寫transit方法。
StatusManager:定義了StatusMachine所需要的所有Status對象,這些對象都是全局靜態單例的。
StatefulObject: Stateful對象的實現
StatusMachine: 主業務流程,主業務流程中需要操作一個或多個有狀態對象的狀態改變,調用“有狀態”對象的nextStatus即可。
4. 簡單實現
簡單實例