[設計模式] 狀態模式

[設計模式] 狀態模式

手機用戶請 橫屏獲取最佳閱讀體驗, 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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索