Java狀態模式

      網友投稿 656 2022-05-30

      狀態模式

      在狀態模式(State Pattern)中,類的行為是基于它的狀態改變的。這種類型的設計模式屬于行為型模式。

      在狀態模式中,我們創建表示各種狀態的對象和一個行為隨著狀態對象改變而改變的 context 對象。

      介紹

      意圖: 允許對象在內部狀態發生改變時改變它的行為,對象看起來好像修改了它的類。

      主要解決: 對象的行為依賴于它的狀態(屬性),并且可以根據它的狀態改變而改變它的相關行為。

      何時使用: 代碼中包含大量與對象狀態有關的條件語句。

      如何解決: 將各種具體的狀態類抽象出來。

      關鍵代碼: 通常命令模式的接口中只有一個方法。而狀態模式的接口中有一個或者多個方法。而且,狀態模式的實現類的方法,一般返回值,或者是改變實例變量的值。也就是說,狀態模式一般和對象的狀態有關。實現類的方法有不同的功能,覆蓋接口中的方法。狀態模式和命令模式一樣,也可以用于消除 if…else 等條件選擇語句。

      優點:

      1、封裝了轉換規則。

      2、枚舉可能的狀態,在枚舉狀態之前需要確定狀態種類。

      3、將所有與某個狀態有關的行為放到一個類中,并且可以方便地增加新的狀態,只需要改變對象狀態即可改變對象的行為。

      4、允許狀態轉換邏輯與狀態對象合成一體,而不是某一個巨大的條件語句塊。

      5、可以讓多個環境對象共享一個狀態對象,從而減少系統中對象的個數。

      缺點:

      1、狀態模式的使用必然會增加系統類和對象的個數。

      2、狀態模式的結構與實現都較為復雜,如果使用不當將導致程序結構和代碼的混亂。

      3、狀態模式對"開閉原則"的支持并不太好,對于可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源代碼,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源代碼。

      使用場景:

      Java狀態模式

      1、行為隨狀態改變而改變的場景。

      2、條件、分支語句的代替者。

      注意事項: 在行為受狀態約束的時候使用狀態模式,而且狀態不超過 5 個。

      實現

      我們將創建一個 State 接口和實現了 State 接口的實體狀態類。Context 是一個帶有某個狀態的類。

      StatePatternDemo,我們的演示類使用 Context 和狀態對象來演示 Context 在狀態改變時的行為變化。

      步驟 1

      創建一個接口。

      State.java

      public interface State { public void doAction(Context context); }

      步驟 2

      創建實現接口的實體類。

      StartState.java

      public class StartState implements State { public void doAction(Context context) { System.out.println("Player is in start state"); context.setState(this); } public String toString(){ return "Start State"; } }

      StopState.java

      public class StopState implements State { public void doAction(Context context) { System.out.println("Player is in stop state"); context.setState(this); } public String toString(){ return "Stop State"; } }

      步驟 3

      創建 Context 類。

      Context.java

      public class Context { private State state; public Context(){ state = null; } public void setState(State state){ this.state = state; } public State getState(){ return state; } }

      步驟 4

      使用 Context 來查看當狀態 State 改變時的行為變化。

      StatePatternDemo.java public class StatePatternDemo { 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()); } }

      步驟 5

      執行程序,輸出結果:

      Player is in start state Start State Player is in stop state Stop State

      Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:華為云大數據分析7天訓練營(二)
      下一篇:vuex的基礎使用以及四個map方法和xuex模塊化和命名空間總結
      相關文章
      亚洲黄色在线网站| 国产一区二区三区亚洲综合| 曰韩亚洲av人人夜夜澡人人爽| 国产成人精品日本亚洲网址| 久久精品国产亚洲AV麻豆网站 | 亚洲国产婷婷六月丁香| 亚洲AV成人潮喷综合网| 亚洲成av人片在www鸭子| 亚洲另类无码专区首页| 亚洲а∨天堂久久精品9966| 亚洲Av高清一区二区三区| 亚洲宅男天堂a在线| 亚洲精品国产成人中文| 亚洲的天堂av无码| 亚洲福利电影在线观看| 亚洲理论精品午夜电影| 亚洲无线一二三四区| 亚洲国产品综合人成综合网站| 亚洲电影免费观看| 亚洲无圣光一区二区| 亚洲理论片在线中文字幕| 91亚洲视频在线观看| 亚洲va在线va天堂va手机| 33333在线亚洲| 亚洲精品美女久久久久久久| 色五月五月丁香亚洲综合网| vvvv99日韩精品亚洲| 亚洲午夜精品久久久久久浪潮| 久久久久亚洲AV无码专区网站| 国产亚洲精品成人AA片新蒲金 | 亚洲人配人种jizz| 亚洲精品美女网站| 亚洲乱码无人区卡1卡2卡3| 亚洲大码熟女在线观看| 无码专区一va亚洲v专区在线| 亚洲国产综合无码一区二区二三区| 久久亚洲2019中文字幕| 久久久久久a亚洲欧洲aⅴ| 亚洲午夜久久久精品影院| 亚洲国产精品一区二区久| 色天使亚洲综合在线观看|