[設計模式] 狀態模式
手機用戶請
橫屏
獲取最佳閱讀體驗,REFERENCES
中是本文參考的連接,如須要連接和更多資源,能夠關注其餘博客發佈地址。java
平臺 | 地址 |
---|---|
CSDN | https://blog.csdn.net/sinat_28690417 |
簡書 | https://www.jianshu.com/u/3032cc862300 |
我的博客 | https://yiyuery.github.io/NoteBooks/ |
狀態模式:容許對象在內部狀態改變是改變它的行爲,對象看起來好像修改了它的類。你須要在一個類中管理狀態,狀態模式提供了封裝狀態的技巧。git
UML
類設計github
代碼實踐算法
實戰
模擬一個任務的狀態變化設計模式
開始準備微信
運行架構
手動結束中app
結束ide
手動恢復 ...函數
核心接口
TaskState
public interface TaskState { /** * 執行 */ void handle(); /** * 獲取狀態 */ void getStatus();}
各類狀態實現
//準備狀態@Data@AllArgsConstructorpublic class PrepareState implements TaskState { private TaskStateManagerContext context; /** * 執行 */ @Override public void handle() { System.out.println("Task Preparing..."); context.setCurrentState(new RunningState(context)); } @Override public void getStatus() { System.out.println(">>>>> PrepareState"); }}//運行狀態@Data@AllArgsConstructorpublic class RunningState implements TaskState { private TaskStateManagerContext context; /** * 執行 */ @Override public void handle() { System.out.println("Task running......"); } @Override public void getStatus() { System.out.println(">>>>> RunningState"); }}//手動中止@Data@AllArgsConstructorpublic class DirectStopState implements TaskState{ private TaskStateManagerContext context; /** * 執行 */ @Override public void handle() { System.out.println("Task is stopping..."); context.setCurrentState(new FinishedState(context)); } @Override public void getStatus() { System.out.println(">>>>> DirectStopState"); }}//等等...
Context 狀態管理類
@Datapublic class TaskStateManagerContext { TaskState prepareState; TaskState finishedSate; TaskState directStopState; TaskState suspendState; TaskState runningState; private TaskState currentState; public static void main(String[] args) { TaskStateManagerContext context = new TaskStateManagerContext(); TaskState prepareState = new PrepareState(context); //任務準備狀態 context.setCurrentState(prepareState); context.getCurrentState().handle(); //任務運行狀態 context.getCurrentState().getStatus(); //進行下一個狀態 context.getCurrentState().handle(); //手動干預狀態 context.setCurrentState(new DirectStopState(context)); context.getCurrentState().handle(); //查詢狀態 context.getCurrentState().getStatus(); //Task Preparing... //>>>>> RunningState //Task running...... //Task is stopping... //>>>>> FinishedSate }}
設計要點
角色分析
TaskStateManagerContext:
上下文是一個類,擁有一些內部狀態,用於狀態的切換管理。內部通常會定義 request
方法,能夠委託給對應的狀態類來處理(本文示例中直接在main函數中展現的,未作區分)
TaskState
的接口定義了一個全部具體狀態的共同接口,任何狀態都實現這個相同的接口,這樣依賴,狀態之間能夠互相替換
設計要點
狀態模式容許一個對象基於內部狀態而擁有不一樣行爲
狀態被封裝後,之後每一個狀態內部的變化不會影響到其餘狀態類的設計
狀態模式和策略模式有相同的類圖,可是意圖不同
策略模式一般會用行爲或是算法來配置Context類
狀態模式容許Context隨着狀態變化而改變行爲
狀態轉換能夠由State類或Context類控制
狀態能夠被多個Context實例共享
狀態模式在設計模式中的位置
更多
掃碼關注
架構探險之道
,回覆文章標題,獲取本文相關源碼和資源連接
知識星球(掃碼加入獲取歷史源碼和文章資源連接)
本文分享自微信公衆號 - 架構探險之道(zacsnz1314)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。