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

歡迎訪問 生活随笔!

生活随笔

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

java

Java设计模式—状态模式

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

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

目錄

定義如下:

個人理解:

通用類圖:

角色介紹:

● State——抽象狀態(tài)角色

● ConcreteState——具體狀態(tài)角色

● Context——環(huán)境角色

通用源代碼:

場景類:

狀態(tài)模式的優(yōu)點:

狀態(tài)模式的缺點:

使用場景:


狀態(tài)模式又是一個比較難的設計模式

定義如下:

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

個人理解:

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

通用類圖:

角色介紹:

● State——抽象狀態(tài)角色

接口或抽象類,負責對象狀態(tài)定義,并且封裝環(huán)境角色以實現(xiàn)狀態(tài)切換。

● ConcreteState——具體狀態(tài)角色

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

● Context——環(huán)境角色

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

舉個例子:

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

通用源代碼:

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

抽象狀態(tài)中聲明一個環(huán)境角色,提供各個狀態(tài)類自行訪問,并且提供所有狀態(tài)的抽象行為,由各個實現(xiàn)類實現(xiàn)。

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

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

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

環(huán)境角色有兩個不成文的約束

  • 把狀態(tài)對象聲明為靜態(tài)常量,有幾個狀態(tài)對象就聲明幾個靜態(tài)常量。
  • 環(huán)境角色具有狀態(tài)抽象角色定義的所有行為,具體執(zhí)行使用委托方式。

場景類:

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

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

?

狀態(tài)模式的優(yōu)點:

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

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

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

狀態(tài)模式的缺點:

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

使用場景:

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

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

?

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

?

總結

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

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