有限狀態機與狀態模式

前言

回想當初碩班學習狀態機是一段蠻不錯的回憶,常常為了解一個難解的狀態機而在書桌前熬夜,只為了畫出最精簡的狀態機圖,然後隔天可以跟同學開讀書會討論並分享自己的解法。
最近在趕一個專案,發現自己在開發沒有什麼方法可言,想到了就寫,走了非常多冤枉路,其實如果我能夠有先預留一些時間畫出狀態圖,就可以避免目前物件失控的現象並設計出簡潔的物件。

有限狀態機(Finite state machine)


一個完整的狀態機有幾個元素:

  1. 起始(start->): 並指向一個起始狀態
  2. 狀態: 每個圈圈都是一個狀態
  3. 轉換: 箭頭表示並標示轉換的動作
  4. 結束: 雙圈圈代表可以結束的狀態

繪製狀態機圖可以幫助你精鍊你的流程,把流程最佳化。

狀態模式(State pattern)

我們常常會用列舉Enum放在物件中當做狀態,並且用if else去判斷,好一點則用Switch case

Enum USER_STATE{
  GUEST,
  MEMBER
}

void someMethod(){
  if(User.State == USER_STATE.GEST){
    //Do somthing when user is gest.
  }else if(User.State == USER_STATE.MEMBER){
    //Do somthing when user is member.
  }
}

但是總不能在每個method中都加入狀態的判斷(ex. 一堆if else, swtich case),這樣的作法顯然不太聰明,在這個設計模式中用狀態抽象成為物件的方式來簡化並分隔出每個狀態,而每個狀態相對應該做的事情就在各class中自己解決。
懶得舉例了,大家參考下面連結吧:)

[Design Pattern] 狀態模式(State Pattern)