淺析Java語言中狀態(tài)模式的優(yōu)點(diǎn)
一.介紹
狀態(tài)模式(State Pattern)屬于行為型模式。當(dāng)控制一個對象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過于復(fù)雜時,把相關(guān)判斷邏輯提取出來,用各個不同的狀態(tài)類進(jìn)行表示,系統(tǒng)處于哪種狀態(tài),直接使用相應(yīng)的狀態(tài)類對象進(jìn)行處理,從而消除if/else、switch/case語句
二.UML類圖
定義了多個狀態(tài),每個狀態(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ù) 策略模式多種算法行為選擇一個就能滿足算法之間彼此獨(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實(shí)現(xiàn)Shiro整合JWT的示例代碼
這篇文章主要介紹了Springboot實(shí)現(xiàn)Shiro整合JWT的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Spring實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離詳解
這篇文章主要介紹了Spring?實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離,大多數(shù)系統(tǒng)都是讀多寫少,為了降低數(shù)據(jù)庫的壓力,可以對主庫創(chuàng)建多個從庫,從庫自動從主庫同步數(shù)據(jù),程序中將寫的操作發(fā)送到主庫,將讀的操作發(fā)送到從庫去執(zhí)行,需要的朋友可以參考下2024-01-01Java實(shí)現(xiàn)畫圖的詳細(xì)步驟(完整代碼)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java實(shí)現(xiàn)畫圖的詳細(xì)步驟展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06SpringBoot集成thymeleaf瀏覽器404的解決方案
前后端不分離的古早 SpringMVC 項(xiàng)目通常會使用 thymeleaf 模板引擎來完成 html 頁面與后端接口之間的交互,如果要將項(xiàng)目架構(gòu)升級成 SpringBoot , thymeleaf 也可以照常集成,但有時候會踩到一些坑,所以本文給大家介紹了SpringBoot集成thymeleaf瀏覽器404的解決方案2024-12-12關(guān)于springboot中nacos動態(tài)路由的配置
這篇文章主要介紹了springboot中nacos動態(tài)路由的配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09解決Spring導(dǎo)出可以運(yùn)行的jar包問題
最近需要解決Maven項(xiàng)目導(dǎo)入可執(zhí)行的jar包的問題,如果項(xiàng)目不包含Spring,那么使用mvn assembly:assembly即可,這篇文章主要介紹了Spring導(dǎo)出可以運(yùn)行的jar包,需要的朋友可以參考下2023-03-03SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出
這篇文章主要介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下2021-05-05MyBatis中使用foreach循環(huán)的坑及解決
這篇文章主要介紹了MyBatis中使用foreach循環(huán)的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01