欠下的債總是要還的,狀態機系列已經欠下了近十個月的債了,現在終于有時間來還債了。
上篇有限狀態機實現-狀態機介紹介紹了狀態機的基本概念,不清楚的兄弟姐妹可以先回頭看看。
按照之前的計劃,整個狀態機的實現將分為下面幾個章節介紹
- 狀態機介紹
- 簡單有限狀態機的實現
- 簡單有限狀態機實現(一)
- 簡單有限狀態機的應用實例
- 簡單狀態機功能增強
- 有限狀態機狀態持久化設計
- 有限狀態機持久化實現
再述概念
下圖為一個簡單的狀態機流轉圖,語言描述就是原始狀態接收一個指定的時間,執行對應的行為,流轉到下一個狀態,所謂的State,Trigger(Event),Action 在上一篇文件里已經有過詳細的介紹,此文不在累述。
示例
基于上面的描述,我們要實現一個簡單的狀態機,所要干的幾件事:
- 定義State
- 定義Event
- 定義Action
- 定義流轉(Transition)
- 上下文的傳遞 (上下文的傳遞在任何框架中都是繞不開的問題,所以此處也單獨給出)
- 流轉控制
本章圍繞State,Event的定義展開,會盡量涵蓋功能,但給出的定義并不代表最終版,因為有些概念是要和后面的內容串起來講的。
State要干的那些事
State(狀態)算是狀態機中最簡單的一個概念,實現起來也是最簡的,因為狀態本身不干什么事,State可以就簡單的理解為一個標識,標識給一個Code或者ID就夠了,不過如果想擴展是就是用戶自己的行為,所以我們State是以接口形式提供的。
State實現代碼
public interface State {
/**
* 狀態碼
* @return
*/
String getCode();
}
就是這么簡單
Event干的那些事
狀態機中的Event很多版本的狀態機是叫做Trigger的,意為觸發器,其實很形象,但是個人還是喜歡用Event,用意為事件驅動,Event是一個可以拓展的地方,自動觸發,定時觸發,延時觸發,是否允許重試等,都可以在Event這個地方做拓展,不過我們第一步是定義一個簡單版本的狀態機,目前是先讓一個狀態機可以跑起來,拓展的內容我們放在增強版的。
事件也是需要有標識的,所以同樣提供getCode的方法,另外我們在此先拓展一個自動觸發的基礎功能。
Event實現代碼
public interface Event {
/**
* 事件碼
* @return
*/
String getCode();
/**
* 是否自動觸發
* @return
*/
boolean isAutoTrigger();
}
本節內容先寫到這里,內容不多,也很基礎,后面持續更新。