狀態轉移表+State模式

爲了給用戶提供更好的體驗方式,多級聯動,多種選擇方式,半智能化的容錯能力等是咱們採用的手段,同時這對軟件的開發帶來了更多的複雜性。咱們須要考慮在各類不一樣狀態下,按鈕的功能,以及轉換。ide

在我作過的若干項目中,牽扯這一問題的地方都是很是容易出bug的。界面越簡化,越智能,錯誤率越高。屢次嘗試使用State模式簡化問題,但效果並不明顯。函數

仔細分析一下,發現State模式,解決的就是不一樣狀態下,行爲不一樣的問題。但對於狀態的轉換和遷移,State模式並無給出解決辦法。這就致使有些時候引入State模式會帶來更大的複雜性。例如:有n種可能改變狀態的外部事件,m種狀態,在State的模式中,狀態的轉移被定義在Context類中,這就致使在Context類中,須要對每種外部事件,遍歷全部狀態,決定下一狀態。從而在Context類中最多須要了n*m次IF語句。致使了可讀性的迅速降低。設計

另一種更糟糕的設計是,讓State類來處理外部事件,也就是說對事件的響應放到狀態類中去,從OO分析的角度來看,這樣也無可厚非,對同一外部事件的狀態遷移也能夠算做行爲不一樣的一種方式。然而,當狀態轉移行爲比較複雜時,整個事情就變成了一種災難。當狀態通過屢次轉換,每次你都要找到對應的狀態類,來查看下一次狀態是什麼。換句話說,咱們必須查看完全部的實際狀態類,才能獲得一個完整的狀態遷移狀況。對象

狀態遷移表很好的解決了狀態的遷移的問題。整個狀態轉換一目瞭然。結合State模式,能夠較爲完美的解決這一問題。事件

惋惜的是JAVA並不支持函數對象,不然代碼能夠更加簡化了明瞭。開發

PS:這種解決辦法在Python中常常使用,多學幾種語言,擴展一下本身的視野仍是頗有必要的it

相關文章
相關標籤/搜索