如今關注微信公衆號:碼農小胖哥, 發送關鍵字【抽獎】進行抽獎,可有機會獲取實體編程書籍。活動只剩下3天了抓緊參與!【本次抽獎截止到本週末】java
相信很多java開發者寫過狀態變動的業務,好比訂單流程、請假流程等等。通常會搞一個狀態標識來標識生命週期的某個階段。不少人會寫這種邏輯:編程
若是流程幾十個豈不是要if到爆炸。還有這「0」、「1」是幾個意思?設計模式
優化的辦法固然可使用設計模式中的狀態模式來搞,容許一個具備狀態的對象根據其狀態封裝同一對象的不一樣行爲。咱們能夠編程狀態之間的轉換,而後定義單獨的狀態:安全
可是這種操做會增長過多的狀態對象依賴。那麼有沒騷操做呢?固然有。咱們先來了解了解狀態機。微信
狀態機全稱有限狀態機,由於通常的狀態機的狀態都是離散並且可枚舉的,這就是有限的緣由。狀態機表示有限個狀態以及在這些狀態之間的轉移和動做等行爲的數學模型。通俗的描述狀態機就是定義了一套狀態変更的流程:狀態機包含一個狀態集合,定義當狀態機處於某一個狀態的時候它所能接收的事件以及可執行的行爲,執行完成後,狀態機所處的狀態變化能夠被感知。通常包含如下幾個概念:測試
上圖就是個變動的過程示意。接下來該說另外一個東西java枚舉了。優化
一個Java的枚舉是一種定義的一類常量列表的特殊類型的類。是JDK 1.5中引入的新特性。 枚舉在JDK中其實就是被設計成了單例模式,因此是不容許外部對其進行實例化的,枚舉類型的實例化都是在其加載的時候JVM幫咱們完成的。這是Java虛擬機規範明確規定的,保證了線程的安全性。因爲Java枚舉隱式實現了枚舉超類java.lang.Enum,所以沒法實現另外一個類,可是能夠實現接口。能夠聲明抽象方法由具體的內部枚舉來實現。咱們定義一個顏色枚舉來看看:spa
咱們能夠經過 Colorful.RED.colorName()
直接拿到顏色的名稱,很是方便並且語義化。線程
接下來咱們將結合實際開發場景來實現一個簡單枚舉類型的狀態機來處理業務。設計
訂單派送到收貨這個場景,咱們考慮以下單純的場景:
經歷調度到派送最後到收貨這個簡單過程,咱們能夠定義以下狀態枚舉:
由於調度是初始狀態,因此其prevState方法指向本身,由於收貨時終止狀態因此其nextState指向本身。經過定義這兩個指針來進行操做所須要的流程。固然實際生產要結合你本身的業務來作。
而後咱們訂單流程就能夠這樣搞(省略getter和setter):
咱們來簡單測試一下:
通過兩次的流轉,貨物成功到達買家的手中,狀態也正確的進行了變動,並且可維護性也獲得了保證,只須要變動枚舉流程。好了今天就到這裏,但願你們多多關注。