設計模式之狀態模式 總結篇
- 2019 年 10 月 4 日
- 筆記
狀態模式總結篇
狀態模式總結篇,我們將從以下幾個方面對狀態模式進行總結。

狀態模式出現的意圖是什麼?
通過對象內部狀態發生改變進而來改變對象的行為,對象看起來好像是被修改了一樣。如,沒有糖果的時候(是一個狀態),糖果機就不能運行了,有糖果之後(另一個狀態),投幣就可以出糖果了。
本文出處凱哥Java(kaigejava)講《23種設計模》系列教程種的《狀態模式總結篇》
主要解決的問題是什麼?
對象的行為依賴於對象的狀態變化(屬性變更),並且根據屬性值(狀態)的改變而改變相關的行為。如,出不出糖果這個行為受糖果機裡面有沒有糖果和有沒有投幣這兩個狀態影響而改變的。
什麼時候或者是什麼場景下使用狀態模式?
在我們的程式程式碼中包含和很多與對象狀態有關的條件語句(如if……else……或者是switch等)的時候,就可以使用狀態模式
如何實現狀態模式?
將程式碼中的各種具體的狀態抽象到一個類中。這樣就有了狀態類抽象對象。
使用狀態模式的關鍵點是什麼?
需要和命令模式進行區分。命令模式的介面中,通常情況下只有一個方法,而狀態模式的介面中有一個或者多個方法。還有一個不同的地方就是,狀態模式的時候其實現類的方法一般是返回一個值或者是改變變數的值的。這是因為,狀態模式一般和對象的狀態有關。
狀態模式的優缺點:
優點:
1:對狀態轉換規則進行了封裝;
2:可以使用枚舉類,枚舉出所有可能的狀態。但是需要在枚舉狀態之前確定狀態的種類;
3:擴展性好。將所有與某個或者某些狀態有關的行為放到了一個類對象中,這樣方便管理,並且可以方便的新增狀態,只需要改變對象狀態就可以實現改變對象行為了;
4:程式碼簡潔好維護。狀態模式允許狀態轉換邏輯和狀態對象合為一體,而不是一個巨大的條件語句塊;
5:可以讓多個不同的環境對象共享一個狀態的對象,這樣減少系統中對象的數量。
缺點:
1:增加對象和系統類的個數;
2:結構與實現比較複雜,如果使用不當,可能會造成程式結構和程式碼給人感覺很混亂的;
3:對開閉原則支援不好。
使用狀態模式需要注意事項:
在行為受到狀態約束的時候,使用狀態模式,而且需要注意的是:狀態最好不要超過5個