欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Java語(yǔ)言中狀態(tài)模式的優(yōu)點(diǎn)

 更新時(shí)間:2023年02月16日 15:43:12   作者:非凡的小笨魚(yú)  
狀態(tài)模式允許對(duì)象在內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)好像修改了它的類。這個(gè)模式將狀態(tài)封裝成獨(dú)立的類,并將動(dòng)作委托到 代表當(dāng)前狀態(tài)的對(duì)象,我們知道行為會(huì)隨著內(nèi)部狀態(tài)而改變

一.介紹

狀態(tài)模式(State Pattern)屬于行為型模式。當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí),把相關(guān)判斷邏輯提取出來(lái),用各個(gè)不同的狀態(tài)類進(jìn)行表示,系統(tǒng)處于哪種狀態(tài),直接使用相應(yīng)的狀態(tài)類對(duì)象進(jìn)行處理,從而消除if/else、switch/case語(yǔ)句

二.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();
    }
}

四.使用場(chǎng)景

  • 行為隨狀態(tài)改變而改變
  • 消除復(fù)雜的if/else
  • 狀態(tài)類大概率會(huì)新增
  • 狀態(tài)類中的方法大概率不會(huì)新增

五.狀態(tài)模式與策略模式對(duì)比

狀態(tài)模式與策略模式的UML類圖幾乎相同,因此比較一下兩者的差異

狀態(tài)模式狀態(tài)之間可以存在互相依賴的關(guān)系狀態(tài)之間互相轉(zhuǎn)換,可以反復(fù) 策略模式多種算法行為選擇一個(gè)就能滿足算法之間彼此獨(dú)立

六.優(yōu)點(diǎn)

減少多重條件判斷(使用狀態(tài)模式可以避免多重條件判斷)符合開(kāi)閉原則(結(jié)合工廠模式,生成狀態(tà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實(shí)現(xiàn)Shiro整合JWT的示例代碼

    Springboot實(shí)現(xiàn)Shiro整合JWT的示例代碼

    這篇文章主要介紹了Springboot實(shí)現(xiàn)Shiro整合JWT的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離詳解

    Spring實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離詳解

    這篇文章主要介紹了Spring?實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離,大多數(shù)系統(tǒng)都是讀多寫(xiě)少,為了降低數(shù)據(jù)庫(kù)的壓力,可以對(duì)主庫(kù)創(chuàng)建多個(gè)從庫(kù),從庫(kù)自動(dòng)從主庫(kù)同步數(shù)據(jù),程序中將寫(xiě)的操作發(fā)送到主庫(kù),將讀的操作發(fā)送到從庫(kù)去執(zhí)行,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)畫(huà)圖的詳細(xì)步驟(完整代碼)

    Java實(shí)現(xiàn)畫(huà)圖的詳細(xì)步驟(完整代碼)

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java實(shí)現(xiàn)畫(huà)圖的詳細(xì)步驟展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot集成thymeleaf瀏覽器404的解決方案

    SpringBoot集成thymeleaf瀏覽器404的解決方案

    前后端不分離的古早 SpringMVC 項(xiàng)目通常會(huì)使用 thymeleaf 模板引擎來(lái)完成 html 頁(yè)面與后端接口之間的交互,如果要將項(xiàng)目架構(gòu)升級(jí)成 SpringBoot , thymeleaf 也可以照常集成,但有時(shí)候會(huì)踩到一些坑,所以本文給大家介紹了SpringBoot集成thymeleaf瀏覽器404的解決方案
    2024-12-12
  • 關(guān)于springboot中nacos動(dòng)態(tài)路由的配置

    關(guān)于springboot中nacos動(dòng)態(tài)路由的配置

    這篇文章主要介紹了springboot中nacos動(dòng)態(tài)路由的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot啟動(dòng)遇到的異常問(wèn)題及解決方案

    SpringBoot啟動(dòng)遇到的異常問(wèn)題及解決方案

    這篇文章主要介紹了SpringBoot啟動(dòng)遇到的異常問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 解決Spring導(dǎo)出可以運(yùn)行的jar包問(wèn)題

    解決Spring導(dǎo)出可以運(yùn)行的jar包問(wèn)題

    最近需要解決Maven項(xiàng)目導(dǎo)入可執(zhí)行的jar包的問(wèn)題,如果項(xiàng)目不包含Spring,那么使用mvn assembly:assembly即可,這篇文章主要介紹了Spring導(dǎo)出可以運(yùn)行的jar包,需要的朋友可以參考下
    2023-03-03
  • SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    這篇文章主要介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下
    2021-05-05
  • 詳解Log4j 日志文件存放位置設(shè)置

    詳解Log4j 日志文件存放位置設(shè)置

    這篇文章主要介紹了詳解Log4j 日志文件存放位置設(shè)置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • MyBatis中使用foreach循環(huán)的坑及解決

    MyBatis中使用foreach循環(huán)的坑及解決

    這篇文章主要介紹了MyBatis中使用foreach循環(huán)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論