淺析Java語(yǔ)言中狀態(tài)模式的優(yōu)點(diǎn)
一.介紹
狀態(tài)模式(State Pattern)屬于行為型模式。當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí),把相關(guān)判斷邏輯提取出來(lái),用各個(gè)不同的狀態(tài)類(lèi)進(jìn)行表示,系統(tǒng)處于哪種狀態(tài),直接使用相應(yīng)的狀態(tài)類(lèi)對(duì)象進(jìn)行處理,從而消除if/else、switch/case語(yǔ)句
二.UML類(lèi)圖
定義了多個(gè)狀態(tài),每個(gè)狀態(tài)類(lèi)僅實(shí)現(xiàn)自己的邏輯,由環(huán)境類(lèi)負(fù)責(zé)切換狀態(tài)

三.示意代碼
業(yè)務(wù)代碼
//環(huán)境類(lèi)
public class Car {
private CarState carState;
public Car(CarState carState) {
this.carState = carState;
}
public void setCarState(CarState carState) {
this.carState = carState;
}
public void openDoor(){
carState.openDoor();
}
public void closeDoor(){
carState.closeDoor();
}
public void runCar(){
carState.runCar();
}
}
//抽象狀態(tài)類(lèi)
abstract class CarState{
public abstract void openDoor();
public abstract void closeDoor();
public abstract void runCar();
}
//具體狀態(tài)類(lèi)
class OpenState extends CarState{
@Override
public void openDoor() {
System.out.println("can not open the door");
}
@Override
public void closeDoor() {
System.out.println("close the door success");
}
@Override
public void runCar() {
System.out.println("can not run the car");
}
}
//具體狀態(tài)類(lèi)
class CloseState extends CarState{
@Override
public void openDoor() {
System.out.println("open the door success");
}
@Override
public void closeDoor() {
System.out.println("can not close the door");
}
@Override
public void runCar() {
System.out.println("run the car success");
}
}客戶(hù)端
public class Client {
public static void main(String[] args) {
CarState state = new CloseState();
Car car = new Car(state);
car.openDoor();
car.setCarState(new OpenState());
car.runCar();
}
}
四.使用場(chǎng)景
- 行為隨狀態(tài)改變而改變
- 消除復(fù)雜的if/else
- 狀態(tài)類(lèi)大概率會(huì)新增
- 狀態(tài)類(lèi)中的方法大概率不會(huì)新增
五.狀態(tài)模式與策略模式對(duì)比
狀態(tài)模式與策略模式的UML類(lèi)圖幾乎相同,因此比較一下兩者的差異
狀態(tài)模式狀態(tài)之間可以存在互相依賴(lài)的關(guān)系狀態(tài)之間互相轉(zhuǎn)換,可以反復(fù) 策略模式多種算法行為選擇一個(gè)就能滿(mǎn)足算法之間彼此獨(dú)立
六.優(yōu)點(diǎn)
減少多重條件判斷(使用狀態(tài)模式可以避免多重條件判斷)符合開(kāi)閉原則(結(jié)合工廠(chǎng)模式,生成狀態(tài)的具體子類(lèi)對(duì)象)狀態(tài)之間可以自由轉(zhuǎn)換符合單一職責(zé)原則(將不同狀態(tài)的行為分隔開(kāi))
到此這篇關(guān)于淺析Java語(yǔ)言中狀態(tài)模式的優(yōu)點(diǎn)的文章就介紹到這了,更多相關(guān)Java狀態(tài)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Actuator潛在的OOM問(wèn)題的解決
本文主要介紹了SpringBoot Actuator潛在的OOM問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java/Android 獲取網(wǎng)絡(luò)重定向文件的真實(shí)URL的示例代碼
本篇文章主要介紹了Java/Android 獲取網(wǎng)絡(luò)重定向文件的真實(shí)URL的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Java基本數(shù)據(jù)類(lèi)型族譜與易錯(cuò)點(diǎn)梳理解析
Java有八大基本類(lèi)型,很多同學(xué)只對(duì)經(jīng)常使用的int類(lèi)型比較了解。有的同學(xué)是剛從C語(yǔ)言轉(zhuǎn)入Java學(xué)習(xí),誤以為兩者的基本數(shù)據(jù)類(lèi)型完全相同,這也是大錯(cuò)特錯(cuò)的。今天這本Java基本數(shù)據(jù)類(lèi)型全解析大字典,可以幫助你直接通過(guò)目錄找到你想要了解某一種基本數(shù)據(jù)類(lèi)型2022-01-01
SpringBoot+SpringSecurity實(shí)現(xiàn)認(rèn)證的流程詳解
這篇文章主要介紹了SpringBoot+SpringSecurity實(shí)現(xiàn)認(rèn)證的流程,文中通過(guò)代碼示例和圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-05-05

