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

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

