設計模式筆記 – 狀態模式

分類

  • 行為型

模式的目的(定義)

  • 使上下文對象在持續變換的狀態中,根據不同的狀態實現不同的行為
    •  每一個狀態都是一個對象,狀態內部有對應的進入/執行/退出等等的邏輯
    • 上下文對象內部持有很多變量,讓狀態機/自身判斷目前該處於甚麼狀態以及控制狀態的切換;並引用一個當前的狀態對象,持續執行這個當前狀態的邏輯
    • 如果不用狀態模式,就只能用多個if-else語句來運行不同狀態的切換和狀態邏輯

使用場景例子

  • 有限狀態機(Finite-State-Machine)
    • 遊戲開發中最常見的狀態模式的一種應用,一般用於做一些簡單的AI邏輯
    • 如一個敵人有以下狀態各對應的行動:
      • 常態 = 巡邏
      • 發現玩家 = 追撃
      • 丟失玩家 = 尋找
    • 就可以創建以上三個狀態類,並讓敵人自己根據玩家的發現狀態(沒發現、已發現、發現但丟失),來判斷其當前應執行的行為

類圖

與策略模式的差異

  • 狀態模式與策略模式很類似,同樣是為支持對象在不同情況下執行不同的行為,但是兩者的意圖、維度並不一樣:
    • 策略模式是為了解決通過子類化擴展某類對象的功能,導致繼承結構臃腫,缺乏彈性的問題而出現的替代方案
      • 所以,對象一般會有一個最適用的策略對象,只有在對象因為某些原因,導致其整一套行為邏輯需要改變時,才會設置一個新的策略對象,相對來說更「宏觀」
    • 狀態模式是為了解決原本讓對象在不同狀態下執行不同行為,從而使用大量的if-else判斷語句,導致代碼難以維護而出現的替代方案
      • 所以,對象總體的行為邏輯沒有改變,只是讓對象可以通過簡單地切換狀態對象來切換行為,相對來說更「微觀」

參考書目

  • 《Head First Design Patterns》Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates