狀態(tài)模式

概念

??狀態(tài)模式,就是和對(duì)象的 狀態(tài)相關(guān)的行為型模式。根據(jù)狀態(tài)的不同,類的行為也不同。

角色

抽象狀態(tài)類:定義了狀態(tài)類的通用方法。
具體狀態(tài)類:實(shí)現(xiàn)抽象狀態(tài)類。
環(huán)境類:提供當(dāng)前的狀態(tài)和狀態(tài)管理。

上代碼

抽象狀態(tài)類
public interface State {
    void doAction(Context context);
}
具體狀態(tài)類

??這里實(shí)現(xiàn)后,把當(dāng)前的狀態(tài)設(shè)置給Context,用于表示當(dāng)前的狀態(tài)已經(jīng)改變。

public class StudyState implements State{

    @Override
    public void doAction(Context context) {
        System.out.println("Study");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "Study State";
    }
}
public class RestState implements State{

    @Override
    public void doAction(Context context) {
        System.out.println("Rest");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "Rest State";
    }
}
環(huán)境類
public class Context {
    private State state;

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
    
}
測(cè)試類
public class StateClient {
    public static void main(String[] args) {
        Context context = new Context();
        StudyState state = new StudyState();
        RestState reState = new RestState();
        
        state.doAction(context);
        System.out.println(context.getState().toString());
        
        reState.doAction(context);
        System.out.println(context.getState().toString());

    }
}
結(jié)果
The End

??這樣就完成了一個(gè)簡(jiǎn)單的狀態(tài)模式了,感覺和策略模式有點(diǎn)像,但是狀態(tài)模式更著重于當(dāng)前對(duì)象的狀態(tài)。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn): 1、封裝了轉(zhuǎn)換規(guī)則。 2、枚舉可能的狀態(tài),在枚舉狀態(tài)之前需要確定狀態(tài)種類。 3、將所有與某個(gè)狀態(tài)有關(guān)的行為放到一個(gè)類中,并且可以方便地增加新的狀態(tài),只需要改變對(duì)象狀態(tài)即可改變對(duì)象的行為。 4、允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對(duì)象合成一體,而不是某一個(gè)巨大的條件語(yǔ)句塊。 5、可以讓多個(gè)環(huán)境對(duì)象共享一個(gè)狀態(tài)對(duì)象,從而減少系統(tǒng)中對(duì)象的個(gè)數(shù)。

缺點(diǎn): 1、狀態(tài)模式的使用必然會(huì)增加系統(tǒng)類和對(duì)象的個(gè)數(shù)。 2、狀態(tài)模式的結(jié)構(gòu)與實(shí)現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂。 3、狀態(tài)模式對(duì)"開閉原則"的支持并不太好,對(duì)于可以切換狀態(tài)的狀態(tài)模式,增加新的狀態(tài)類需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無(wú)法切換到新增狀態(tài),而且修改某個(gè)狀態(tài)類的行為也需修改對(duì)應(yīng)類的源代碼。

??暫時(shí)先寫這么多吧,等后面有新的體會(huì)了再繼續(xù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★☆☆】直接出處:狀態(tài)模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 1,290評(píng)論 0 2
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是狀態(tài)模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 狀態(tài)模式和策略模式的區(qū)別 優(yōu)點(diǎn)和缺點(diǎn)...
    w1992wishes閱讀 844評(píng)論 0 6
  • 1 場(chǎng)景問題# 1.1 實(shí)現(xiàn)在線投票## 考慮一個(gè)在線投票的應(yīng)用,要實(shí)現(xiàn)控制同一個(gè)用戶只能投一票,如果一個(gè)用戶反復(fù)...
    七寸知架構(gòu)閱讀 2,043評(píng)論 7 53
  • .概述 在軟件開發(fā)過程中,應(yīng)用程序可能會(huì)根據(jù)不同的情況作出不同的處理。最直接的解決方案是將這些所有可能發(fā)生的情況全...
    泥孩兒0107閱讀 437評(píng)論 0 0
  • 感覺時(shí)間不夠用啊 很快地 一天過去了 漸漸地 這一個(gè)暑假就要過去了 說(shuō)說(shuō)今天一天吧 早上去小組之后,九點(diǎn)半開會(huì),一...
    宋瑞楠_三月閱讀 238評(píng)論 3 0

友情鏈接更多精彩內(nèi)容