日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式—状态模式

發布時間:2023/12/20 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式—状态模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(尊重勞動成果,轉載請注明出處:https://blog.csdn.net/qq_25827845/article/details/52468077冷血之心的博客)

目錄

定義如下:

個人理解:

通用類圖:

角色介紹:

● State——抽象狀態角色

● ConcreteState——具體狀態角色

● Context——環境角色

通用源代碼:

場景類:

狀態模式的優點:

狀態模式的缺點:

使用場景:


狀態模式又是一個比較難的設計模式

定義如下:

當一個對象內在狀態改變時允許其改變行為,這個對象看起來像改變了其類。

個人理解:

通俗的講,狀態模式就是狀態的改變引起了行為的改變,但是,我們只能看到行為的改變,看不到狀態的改變。

通用類圖:

角色介紹:

● State——抽象狀態角色

接口或抽象類,負責對象狀態定義,并且封裝環境角色以實現狀態切換。

● ConcreteState——具體狀態角色

每一個具體狀態必須完成兩個職責:本狀態的行為管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。

● Context——環境角色

定義客戶端需要的接口,并且負責具體狀態的切換。

舉個例子:

? ? ? ? 狀態模式提供了一種對物質運動的另一個觀察視角,通過狀態變更促使行為的變化,就類似水的狀態變更一樣,一碗水的初始狀態是液態,通過加熱轉變為氣態,狀態的改變同時也引起體積的擴大,然后就產生了一個新的行為:鳴笛或頂起壺蓋。

通用源代碼:

//抽象狀態角色 public abstract class State {//定義一個環境角色,提供子類訪問protected Context context;//設置環境角色public void setContext(Context _context){this.context = _context;}//行為1public abstract void handle1();//行為2public abstract void handle2(); }

抽象狀態中聲明一個環境角色,提供各個狀態類自行訪問,并且提供所有狀態的抽象行為,由各個實現類實現。

//具體狀態角色 public class ConcreteState1 extends State { @Overridepublic void handle1() {//本狀態下必須處理的邏輯}@Overridepublic void handle2() {//設置當前狀態為stat2super.context.setCurrentState(Context.STATE2);//過渡到state2狀態,由Context實現super.context.handle2();} } public class ConcreteState2 extends State {@Overridepublic void handle1() { //設置當前狀態為state1super.context.setCurrentState(Context.STATE1);//過渡到state1狀態,由Context實現super.context.handle1();}@Overridepublic void handle2() {//本狀態下必須處理的邏輯} }

具體狀態角色有兩個職責:處理本狀態必須完成的任務,決定是否可以過渡到其他狀態。

//環境角色 public class Context {//定義狀態public final static State STATE1 = new ConcreteState1();public final static State STATE2 = new ConcreteState2();//當前狀態private State CurrentState;//獲得當前狀態public State getCurrentState() {return CurrentState;}//設置當前狀態public void setCurrentState(State currentState) {this.CurrentState = currentState;//切換狀態this.CurrentState.setContext(this);}//行為委托public void handle1(){this.CurrentState.handle1();}public void handle2(){this.CurrentState.handle2();}}

環境角色有兩個不成文的約束

  • 把狀態對象聲明為靜態常量,有幾個狀態對象就聲明幾個靜態常量。
  • 環境角色具有狀態抽象角色定義的所有行為,具體執行使用委托方式。

場景類:

public class Client {public static void main(String[] args) {//定義環境角色Context context = new Context();//初始化狀態context.set CurrentState(new ConcreteState1());//行為執行context.handle1();context.handle2();} }

如上所示:我們只看到了行為發生改變。

?

狀態模式的優點:

● 結構清晰
避免了過多的switch...case或者if...else語句的使用,避免了程序的復雜性,提高系統的可維護性。

● 遵循設計原則
很好地體現了開閉原則和單一職責原則,每個狀態都是一個子類,你要增加狀態就要增加子類,你要修改狀態,你只修改一個子類就可以了。

● 封裝性非常好
這也是狀態模式的基本要求,狀態變換放置到類的內部來實現,外部的調用不用知道類內部如何實現狀態和行為的變換。

狀態模式的缺點:

每一個狀態都是一個子類,容易產生子類膨脹的問題。

使用場景:

● 行為隨狀態改變而改變的場景
? ? ? ?這也是狀態模式的根本出發點,例如權限設計,人員的狀態不同即使執行相同的行為結果也會不同,在這種情況下需要考慮使用狀態模式。

● 條件、分支判斷語句的替代者
? ? ? ?在程序中大量使用switch語句或者if判斷語句會導致程序結構不清晰,邏輯混亂,使用狀態模式可以很好地避免這一問題,它通過擴展子類實現了條件的判斷處理。

?

如果對你有幫助,記得點贊哦~歡迎大家關注我的博客,我會持續更新,如果有什么問題,可以進群366533258一起交流學習哦~

?

總結

以上是生活随笔為你收集整理的Java设计模式—状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。