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