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

Java狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)對(duì)象狀態(tài)轉(zhuǎn)換的優(yōu)雅方式

 更新時(shí)間:2023年04月22日 09:38:51   作者:.番茄炒蛋  
Java狀態(tài)設(shè)計(jì)模式通過(guò)將對(duì)象的行為和狀態(tài)分離,使對(duì)象能夠根據(jù)不同的狀態(tài)進(jìn)行不同的行為操作。它通過(guò)將狀態(tài)抽象成一個(gè)獨(dú)立的類來(lái)實(shí)現(xiàn)對(duì)狀態(tài)的封裝,從而簡(jiǎn)化了復(fù)雜的條件判斷和狀態(tài)轉(zhuǎn)換

介紹

Java狀態(tài)模式(State Pattern)是一種面向?qū)ο蟮脑O(shè)計(jì)模式,它將對(duì)象的狀態(tài)封裝成獨(dú)立的狀態(tài)對(duì)象,并將對(duì)象的行為與狀態(tài)對(duì)象解耦,它允許對(duì)象在其內(nèi)部狀態(tài)發(fā)生改變時(shí),改變其行為.該模式將對(duì)象的行為封裝在不同的狀態(tài)對(duì)象中,而不是將所有的行為都放在一個(gè)類中.

Java狀態(tài)模式通產(chǎn)由以下3種角色組成:

  • 狀態(tài)接口(State Interface):定義了一組與上下文對(duì)象相關(guān)的方法,這些方法將在不同狀態(tài)下被具體對(duì)象實(shí)現(xiàn).
  • 具體狀態(tài)(Concrete State):實(shí)現(xiàn)了狀態(tài)接口,具體狀態(tài)對(duì)象是不同的狀態(tài)實(shí)現(xiàn).
  • 上下文(Context):具有多種狀態(tài)的對(duì)象,上下文對(duì)象可以在運(yùn)行時(shí)改變狀態(tài),從而改變它的行為.

需要注意的是,Java狀態(tài)模式的實(shí)現(xiàn)有多種方式,如使用接口和抽象類實(shí)現(xiàn)狀態(tài),使用枚舉實(shí)現(xiàn)狀態(tài)等.具體的實(shí)現(xiàn)方式取決于具體的需求和場(chǎng)景.

實(shí)現(xiàn)

假設(shè)我們有一個(gè)簡(jiǎn)單的游戲,游戲中的主人公可以在不同的狀態(tài)下進(jìn)行不同的操作.我們可以使用狀態(tài)模式來(lái)實(shí)現(xiàn)這個(gè)游戲的設(shè)計(jì).

狀態(tài)接口

public interface State {
    /**
     * 移動(dòng)
     */
    void move();
    /**
     * 攻擊
     */
    void attack();
}

具體狀態(tài)

public class IdleState implements State{
    /**
     * 移動(dòng)
     */
    @Override
    public void move() {
        System.out.println("靜止?fàn)顟B(tài)下不能移動(dòng)...");
    }
    /**
     * 攻擊
     */
    @Override
    public void attack() {
        System.out.println("靜止?fàn)顟B(tài)下不能攻擊...");
    }
}
public class MoveState implements State{
    /**
     * 移動(dòng)
     */
    @Override
    public void move() {
        System.out.println("移動(dòng)中...");
    }
    /**
     * 攻擊
     */
    @Override
    public void attack() {
        System.out.println("移動(dòng)狀態(tài)下不能攻擊...");
    }
}
public class AttackState implements State{
    /**
     * 移動(dòng)
     */
    @Override
    public void move() {
        System.out.println("攻擊狀態(tài)下不能移動(dòng)...");
    }
    /**
     * 攻擊
     */
    @Override
    public void attack() {
        System.out.println("攻擊中...");
    }
}

上下文

public class Context {
    private State state;
    public Context() {
        // 默認(rèn)靜止?fàn)顟B(tài)
        this.state = new IdleState();
    }
    public void setState(State state) {
        this.state = state;
    }
    /**
     * 移動(dòng)
     */
    public void move() {
        state.move();
    }
    /**
     * 攻擊
     */
    public void attack() {
        state.attack();
    }
}

測(cè)試

public class Demo {
    public static void main(String[] args) {
        // 靜止?fàn)顟B(tài)
        Context context = new Context();
        context.move();
        context.attack();
        // 移動(dòng)狀態(tài)
        context.setState(new MoveState());
        context.move();
        context.attack();
        // 攻擊狀態(tài)
        context.setState(new AttackState());
        context.move();
        context.attack();
    }
}

在上面這個(gè)例子中,首先我們定義了一個(gè)State接口,然后我們定義三個(gè)具體的狀態(tài)類,IdleState,MoveState和AttackState,分別表示主人公的空閑狀態(tài),移動(dòng)狀態(tài)和攻擊狀態(tài),這些狀態(tài)都實(shí)現(xiàn)了State接口.接下來(lái)我們定義了一個(gè)上下文Context,它包含了一個(gè)State對(duì)象,表示當(dāng)前的狀態(tài).在Context類中,我們定義了一個(gè)setState方法用于改變狀態(tài),以及move和attack方法用于執(zhí)行相應(yīng)的操作.

總結(jié)

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

  • 狀態(tài)模式使得添加狀態(tài)變得簡(jiǎn)單,只需要添加一個(gè)新的狀態(tài)類即可.
  • 狀態(tài)模式通過(guò)將狀態(tài)轉(zhuǎn)換邏輯封裝在狀態(tài)類中,使得對(duì)象的狀態(tài)變化更加明確和清晰.
  • 狀態(tài)模式使得狀態(tài)切換變得更簡(jiǎn)單,只需要調(diào)用對(duì)象的狀態(tài)轉(zhuǎn)換方法即可.

缺點(diǎn)

  • 狀態(tài)模式會(huì)導(dǎo)致系統(tǒng)中類的數(shù)量增加,增加代碼的復(fù)雜度.
  • 狀態(tài)模式可能會(huì)導(dǎo)致?tīng)顟B(tài)切換的流程變得復(fù)雜.

應(yīng)用場(chǎng)景

  • 當(dāng)對(duì)象的行為取決于其狀態(tài),并且該狀態(tài)可以在運(yùn)行時(shí)發(fā)生改變時(shí),狀態(tài)模式就是一種很好的選擇.
  • 當(dāng)一個(gè)對(duì)象需要根據(jù)其狀態(tài)執(zhí)行不同的操作時(shí),狀態(tài)模式非常有用.
  • 當(dāng)需要?jiǎng)討B(tài)地向?qū)ο筇砑有碌男袨闀r(shí),狀態(tài)模式是一種很好的選擇.

一些常見(jiàn)的應(yīng)用場(chǎng)景包括:訂單狀態(tài);用戶登錄狀態(tài);游戲狀態(tài)等等.

到此這篇關(guān)于Java狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)對(duì)象狀態(tài)轉(zhuǎn)換的優(yōu)雅方式的文章就介紹到這了,更多相關(guān)Java狀態(tài)設(shè)計(jì)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring aop之鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn)

    spring aop之鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn)

    這篇文章主要介紹了spring aop之鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • java開發(fā)的工廠方法模式及抽象工廠驗(yàn)證示例

    java開發(fā)的工廠方法模式及抽象工廠驗(yàn)證示例

    這篇文章主要為大家介紹了java開發(fā)中的工廠方法模式以及抽象工廠的驗(yàn)證示例,有需要的朋友可以借鑒參考下希望能夠有所幫助祝大家多多進(jìn)步
    2021-10-10
  • IDEA SpringBoot 項(xiàng)目配置Swagger2的詳細(xì)教程

    IDEA SpringBoot 項(xiàng)目配置Swagger2的詳細(xì)教程

    這篇文章主要介紹了IDEA SpringBoot 項(xiàng)目配置Swagger2的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java中LocalDateTime的具體用法

    Java中LocalDateTime的具體用法

    本文主要介紹了Java中LocalDateTime的具體用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 關(guān)于LinkedList集合對(duì)元素進(jìn)行增查刪操作

    關(guān)于LinkedList集合對(duì)元素進(jìn)行增查刪操作

    LinkedList集合內(nèi)部包含有兩個(gè)Node類型的first和last屬性維護(hù)一個(gè)雙向循環(huán)鏈表,在鏈表中的每一個(gè)元素都使用引用的方式來(lái)記住它的前一個(gè)元素和后一個(gè)元素,從而可以將所有的元素彼此連接起來(lái),需要的朋友可以參考下
    2023-04-04
  • Jmerte分布式壓測(cè)及分布式壓測(cè)配置教程

    Jmerte分布式壓測(cè)及分布式壓測(cè)配置教程

    這篇文章主要介紹了Jmerte分布式壓測(cè)及分布式壓測(cè)配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Java 中組合模型之對(duì)象結(jié)構(gòu)模式的詳解

    Java 中組合模型之對(duì)象結(jié)構(gòu)模式的詳解

    這篇文章主要介紹了Java 中組合模型之對(duì)象結(jié)構(gòu)模式的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家理解應(yīng)用對(duì)象結(jié)構(gòu)模型,需要的朋友可以參考下
    2017-09-09
  • Java?數(shù)據(jù)交換?Json?和?異步請(qǐng)求?Ajax詳解

    Java?數(shù)據(jù)交換?Json?和?異步請(qǐng)求?Ajax詳解

    Json(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,采用鍵值對(duì)的形式來(lái)表示數(shù)據(jù),它廣泛應(yīng)用于Web開發(fā)中,特別適合于前后端數(shù)據(jù)傳輸和存儲(chǔ),這篇文章主要介紹了Java數(shù)據(jù)交換Json和異步請(qǐng)求Ajax,需要的朋友可以參考下
    2023-09-09
  • ConditionalOnProperty配置swagger不生效問(wèn)題及解決

    ConditionalOnProperty配置swagger不生效問(wèn)題及解決

    這篇文章主要介紹了ConditionalOnProperty配置swagger不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在

    IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在

    這篇文章主要介紹了IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評(píng)論