java23種設計模式-行為型模式-狀態模式
阿新 • • 發佈:2020-12-05
一、定義
狀態(State)模式的定義:對有狀態的物件,把複雜的“判斷邏輯”提取到不同的狀態物件中,允許狀態物件在其內部狀態發生改變時改變其行為。
二、優點及缺點
優點:
1、結構清晰,狀態模式將與特定狀態相關的行為區域性化到一個狀態中,並且將不同狀態的行為分割開來,滿足“單一職責原則”。
2、將狀態轉換顯示化,減少物件間的相互依賴。將不同的狀態引入獨立的物件中會使得狀態轉換變得更加明確,且減少物件間的相互依賴。
3、狀態類職責明確,有利於程式的擴充套件。通過定義新的子類很容易地增加新的狀態和轉換。
缺點:
1、狀態模式的使用必然會增加系統的類與物件的個數。
2、狀態模式的結構與實現都較為複雜,如果使用不當會導致程式結構和程式碼的混亂。
3、狀態模式對開閉原則的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的原始碼,否則無法切換到新增狀態,而且修改某個狀態類的行為也需要修改對應類的原始碼。
三、程式碼實現:
環境類:
package zhuangtaimoshi; /** * @Author: caesar * @Date:2020年12月05日 16:12:00 * @Description: 環境類 */ public class Context { // 狀態類 private State state; // 初始化狀態類 public Context(){this.state = new StateA(); } // get和set public State getState() { return state; } public void setState(State state) { this.state = state; } // 處理請求 public void handle(){ this.state.Handle(this); } }
狀態抽象類:
package zhuangtaimoshi; /** * @Author: caesar * @Date:2020年12月05日 16:12:19 * @Description: 抽象狀態類*/ public abstract class State { public abstract void Handle(Context context); }
狀態實現類A:
package zhuangtaimoshi; /** * @Author: caesar * @Date:2020年12月05日 18:12:04 * @Description: 狀態類A */ public class StateA extends State{ @Override public void Handle(Context context) { System.out.println("這是狀態A"); context.setState(new StateB()); } }
狀態實現類B:
package zhuangtaimoshi; /** * @Author: caesar * @Date:2020年12月05日 16:12:16 * @Description: 狀態類B */ public class StateB extends State{ @Override public void Handle(Context context) { System.out.println("這是狀態B"); context.setState(new StateA()); } }
測試類:
package zhuangtaimoshi; /** * @Author: caesar * @Date:2020年12月05日 18:12:02 * @Description: 測試類 */ public class Test { public static void main(String[] args) { StateB stateB = new StateB(); Context context = new Context(); context.handle(); context.handle(); context.setState(stateB); context.handle(); } }
四、原始碼級別
五、總結
主要解決:當一個物件的行為取決於它的狀態,並且它必須在執行時根據狀態改變它的行為時,就可以考慮使用狀態模式。一個操作中含有龐大的分支結構,並且這些分支決定於物件的狀態時。