大话设计模式—状态模式
在狀態模式(State Pattern)中,類的行為是基于它的狀態改變的。這種類型的設計模式屬于行為型模式。我們創建表示各種狀態的對象和一個行為隨著狀態對象改變而改變的 context 對象。
大話設計模式中程杰老師給出的定義是,狀態模式:當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過于復雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把復雜的判斷邏輯簡化。當然,如果這個狀態判斷很簡單就沒有必要使用“狀態模式”了。
狀態模式結構圖如下:
結構圖解析:
1、State,抽象狀態類,定義一個接口以封裝與Context的一個特定狀態相關的行為;
2、ConcreteState類,具體狀態類,每一個子類實現一個與Context的一個狀態相關的行為;
3、Context類,維護一個ConcreteState子類的實例,這個實例定義當前的狀態;
下面給出一個運動員開始和結束運動的實例還具體看一下狀態模式的運用,類圖如下:
package com.exercise.state; /*** 抽象狀態接口* @author lmb**/ public interface State {public void doAction(Context context);} package com.exercise.state; /*** 狀態對象StartState* @author lmb**/ public class StartState implements State {@Overridepublic void doAction(Context context) {System.out.println("Player is in start state.");context.setState(this);}public String toString(){return "start state";}} package com.exercise.state; /*** 狀態對象StopState* @author lmb**/ public class StopState implements State {@Overridepublic void doAction(Context context) {System.out.println("Player is in stop state.");context.setState(this);}public String toString(){return "stop state";}} package com.exercise.state; /*** 行為隨著狀態對象改變而改變的Context類* @author lmb**/ public class Context {public State state;public Context(){state = null;}public State getState() {return state;}public void setState(State state) {this.state = state;}} package com.exercise.state;public class TestState {public static void main(String[] args) {Context context = new Context();StartState startState = new StartState();startState.doAction(context);//將狀態設定為開始狀態System.out.println(context.getState().toString());StopState stopState = new StopState();stopState.doAction(context);//將狀態設定為結束狀態System.out.println(context.getState().toString());}}運行結果:
Player is in start state. start state Player is in stop state. stop state狀態模式的好處:
將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。簡而言之就是,將特定狀態相關的行為都放入一個對象中,由于所有與狀態相關的代碼都存在于某個State實現類中,所以通過定義新的子類可以很容易的增加新的狀態和轉換。這樣做的目的就是為了消除龐大的分支語句,大的分支判斷通過會使得它們難以修改和擴展。狀態模式通過把各種狀態轉移邏輯分不到State子類之間,來減少相互間的依賴,這樣就容易維護和擴展了。
使用場景:
當一個對象的行為取決于它的狀態,并且它必須在運行時刻根據狀態改變它的行為時,就可以考慮使用狀態模式。
缺點:
1、狀態模式的使用必然會增加系統類和對象的個數。
2、狀態模式的結構與實現都較為復雜,如果使用不當將導致程序結構和代碼的混亂。
3、狀態模式對”開閉原則”的支持并不太好,對于可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源代碼,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源代碼。
注意事項:在行為受狀態約束的時候使用狀態模式,而且狀態不超過 5 個。
總結
以上是生活随笔為你收集整理的大话设计模式—状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大话设计模式—观察者模式
- 下一篇: 大话设计模式—适配器模式