最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的有限狀態(tài)機(jī)(設(shè)計(jì)模式——狀態(tài)模式)

 更新時(shí)間:2023年08月21日 10:28:31   作者:bjxiaxueliang  
這篇文章主要介紹了Java中的有限狀態(tài)機(jī)(設(shè)計(jì)模式——狀態(tài)模式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java有限狀態(tài)機(jī) (設(shè)計(jì)模式——狀態(tài)模式)

編寫(xiě)代碼的時(shí)候,有時(shí)會(huì)遇見(jiàn)較為復(fù)雜的 swith...case... if...else... 語(yǔ)句。

這一刻有時(shí)會(huì)想到狀態(tài)機(jī),用 有限狀態(tài)機(jī) 替換 swith...case... if...else... 可以:

  • 降低程序的復(fù)雜度;
  • 提高程序的可維護(hù)性;
  • 狀態(tài)機(jī)模式體現(xiàn)了開(kāi)閉原則和單一職責(zé)原則。
    每個(gè)狀態(tài)都是一個(gè)子類,增加狀態(tài)就要增加子類;修改狀態(tài)只要修改一個(gè)類就行了。

以上是有限狀態(tài)機(jī)的好處。

其亦有 缺點(diǎn)

  • 使用狀態(tài)機(jī)子類會(huì)增多,也就是類膨脹,這點(diǎn)需要程序員在開(kāi)發(fā)中自己衡量。

狀態(tài)模式定義

Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.

允許對(duì)象在其內(nèi)部狀態(tài)發(fā)生變化時(shí)更改其行為。

看起來(lái)像更改了其類 (這翻譯不好,這里 應(yīng)該是體現(xiàn)了其封裝性:外部的調(diào)用不用知道其內(nèi)部如何實(shí)現(xiàn)狀態(tài)和行為變化的)。

舉個(gè)例子

我們每天都乘坐電梯,電梯有四種狀態(tài): 開(kāi)門、關(guān)門、運(yùn)行、停止。

Col1開(kāi)門 行為關(guān)門 行為運(yùn)行 行為停止 行為
開(kāi)門 態(tài)noyesnono
關(guān)門 態(tài)yesnoyesyes
運(yùn)行 態(tài)nononoyes
停止 態(tài)yesnoyesno

LiftState.java

/**
 * 定義電梯行為:打開(kāi)、關(guān)閉、運(yùn)行、停止
 */
public abstract class LiftState {
    // 擁有一個(gè)電梯對(duì)象,用于更新電梯當(dāng)前狀態(tài)
    protected Lift mLift;
    /**
     * 通過(guò)構(gòu)造函數(shù)引入電梯的實(shí)例化對(duì)象
     *
     * @param lift
     */
    public LiftState(Lift lift) {
        this.mLift = lift;
    }
    /**
     * 行為:打開(kāi)電梯門
     */
    public abstract void open();
    /**
     * 行為:關(guān)閉電梯門
     */
    public abstract void close();
    /**
     * 行為:電梯運(yùn)行
     */
    public abstract void run();
    /**
     * 行為:電梯停止運(yùn)行
     */
    public abstract void stop();
}

電梯的四種狀態(tài)

public class OpeningState extends LiftState {
    public OpeningState(Lift lift) {
        super(lift);
    }
    @Override
    public void open() {
        // 執(zhí)行開(kāi)門動(dòng)作
        System.out.println("執(zhí)行開(kāi)門動(dòng)作");
    }
    @Override
    public void close() {
        // 執(zhí)行關(guān)門動(dòng)作
        // 1、轉(zhuǎn)化為關(guān)門狀態(tài)
        mLift.setState(mLift.getCloseingState());
        // 2、關(guān)門
        mLift.close();
    }
    @Override
    public void run() {
        // do noting
        // 開(kāi)門狀態(tài),不能執(zhí)行運(yùn)行動(dòng)作
    }
    @Override
    public void stop() {
        // do noting
        // 開(kāi)門狀態(tài)下,不執(zhí)行停止動(dòng)作
    }
}
public class ClosingState extends LiftState {
    public ClosingState(Lift lift) {
        super(lift);
    }
    @Override
    public void open() {
        // 執(zhí)行開(kāi)門動(dòng)作
        // 1、變化為開(kāi)門狀態(tài)
        this.mLift.setState(mLift.getOpenningState());
        // 2、開(kāi)門
        this.mLift.open();
    }
    @Override
    public void close() {
        System.out.println("執(zhí)行關(guān)門動(dòng)作");
    }
    @Override
    public void run() {
        // 運(yùn)行動(dòng)作
        // 1、運(yùn)行狀態(tài)
        this.mLift.setState(mLift.getRunningState());
        // 2、運(yùn)行動(dòng)作
        this.mLift.run();
    }
    @Override
    public void stop() {
        // 停止動(dòng)作
        // 1、轉(zhuǎn)化為停止?fàn)顟B(tài)
        this.mLift.setState(mLift.getStoppingState());
        // 2、停止
        this.mLift.stop();
    }
}
public class RunningState extends LiftState {
    public RunningState(Lift lift) {
        super(lift);
    }
    @Override
    public void open() {
        // do noting
    }
    @Override
    public void close() {
        // do noting
    }
    @Override
    public void run() {
        // 運(yùn)行動(dòng)作
        System.out.println("電梯上下運(yùn)行中...");
    }
    @Override
    public void stop() {
        // 停止動(dòng)作
        // 1、轉(zhuǎn)化為停止?fàn)顟B(tài)
        this.mLift.setState(mLift.getStoppingState());
        // 2、停止動(dòng)作
        this.mLift.stop();
    }
}
public class StoppingState extends LiftState {
    public StoppingState(Lift lift) {
        super(lift);
    }
    @Override
    public void open() {
        // 開(kāi)門動(dòng)作
        // 1、開(kāi)門狀態(tài)
        this.mLift.setState(mLift.getOpenningState());
        // 2、執(zhí)行開(kāi)門動(dòng)作
        this.mLift.open();
    }
    @Override
    public void close() {
        // do noting
    }
    @Override
    public void run() {
        // 運(yùn)行動(dòng)作
        // 1、運(yùn)行狀態(tài)
        this.mLift.setState(mLift.getRunningState());
        // 2、運(yùn)行動(dòng)作
        this.mLift.run();
    }
    @Override
    public void stop() {
        // 電梯停止動(dòng)作
        System.out.println("電梯停止運(yùn)行...");
    }
}

定義電梯類

/**
 * 定義電梯類
 */
public class Lift {
    //定義出電梯的所有狀態(tài)
    private LiftState openningState;
    private LiftState closingState;
    private LiftState runningState;
    private LiftState stoppingState;
    // 定義當(dāng)前電梯狀態(tài)
    private LiftState mCurState;
    /**
     * 構(gòu)造方法
     */
    public Lift() {
        openningState = new OpeningState(this);
        closingState = new ClosingState(this);
        runningState = new RunningState(this);
        stoppingState = new StoppingState(this);
    }
    /**
     * 執(zhí)行開(kāi)門動(dòng)作
     */
    public void open() {
        mCurState.open();
    }
    /**
     * 執(zhí)行關(guān)門動(dòng)作
     */
    public void close() {
        mCurState.close();
    }
    /**
     * 執(zhí)行運(yùn)行動(dòng)作
     */
    public void run() {
        mCurState.run();
    }
    /**
     * 執(zhí)行停止動(dòng)作
     */
    public void stop() {
        mCurState.stop();
    }
    // ##################設(shè)置當(dāng)前電梯狀態(tài)#####################
    /**
     * 設(shè)置當(dāng)前電梯狀態(tài)
     *
     * @param state
     */
    public void setState(LiftState state) {
        this.mCurState = state;
    }
    // ###################獲取電梯的全部狀態(tài)####################
    public LiftState getOpenningState() {
        return openningState;
    }
    public LiftState getCloseingState() {
        return closingState;
    }
    public LiftState getRunningState() {
        return runningState;
    }
    public LiftState getStoppingState() {
        return stoppingState;
    }
}

運(yùn)行

public static void main(String[] args) {
        Lift lift = new Lift();
        lift.setState(new ClosingState(lift));
        lift.open();
        lift.close();
        lift.run();
        lift.stop();
    }

運(yùn)行結(jié)果

執(zhí)行開(kāi)門動(dòng)作
執(zhí)行關(guān)門動(dòng)作
電梯上下運(yùn)行中...
電梯停止運(yùn)行...

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開(kāi)瀏覽器訪問(wèn)項(xiàng)目方式

    springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開(kāi)瀏覽器訪問(wèn)項(xiàng)目方式

    這篇文章主要介紹了springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開(kāi)瀏覽器訪問(wèn)項(xiàng)目方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Spring中的@Async原理分析

    Spring中的@Async原理分析

    這篇文章主要介紹了Spring中的@Async原理分析,自定義new ThreadPoolExecutor并調(diào)用invokeAll等進(jìn)行并發(fā)編程,后面發(fā)現(xiàn)只要在方法上添加@Async注解,并使用@EnableAsync進(jìn)行開(kāi)啟默認(rèn)會(huì)使用SimpleAsyncTaskExecutor類型,需要的朋友可以參考下
    2024-01-01
  • SpringBoot中的統(tǒng)一異常處理詳細(xì)解析

    SpringBoot中的統(tǒng)一異常處理詳細(xì)解析

    這篇文章主要介紹了SpringBoot中的統(tǒng)一異常處理詳細(xì)解析,該注解可以把異常處理器應(yīng)用到所有控制器,而不是單個(gè)控制器,借助該注解,我們可以實(shí)現(xiàn):在獨(dú)立的某個(gè)地方,比如單獨(dú)一個(gè)類,定義一套對(duì)各種異常的處理機(jī)制,需要的朋友可以參考下
    2024-01-01
  • Java中的StampedLock實(shí)現(xiàn)原理詳解

    Java中的StampedLock實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java中的StampedLock實(shí)現(xiàn)原理詳解,ReentrantReadWriteLock采用悲觀讀,第一個(gè)讀線程拿到鎖后,第二個(gè)/第三個(gè)讀線程可以拿到鎖,特別是在讀線程很多,寫(xiě)線程很少時(shí),需要的朋友可以參考下
    2024-01-01
  • 使用@Service注解出現(xiàn)No bean named 'xxxx' available]錯(cuò)誤的解決

    使用@Service注解出現(xiàn)No bean named 'xxxx'&

    這篇文章主要介紹了使用@Service注解出現(xiàn)No bean named 'xxxx' available]錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Springboot事件和bean生命周期執(zhí)行機(jī)制實(shí)例詳解

    Springboot事件和bean生命周期執(zhí)行機(jī)制實(shí)例詳解

    這篇文章主要介紹了Springboot事件和bean的生命周期執(zhí)行機(jī)制,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟

    Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟

    本文主要記錄如何通過(guò)Gitlab CI/CD自動(dòng)部署SpringBoot項(xiàng)目jar包。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Java去掉小數(shù)點(diǎn)后面無(wú)效0的方案與建議

    Java去掉小數(shù)點(diǎn)后面無(wú)效0的方案與建議

    當(dāng)前小數(shù)點(diǎn)后面的位數(shù)過(guò)多的時(shí)候,多余的0沒(méi)有實(shí)際意義,下面這篇文章主要給大家介紹了關(guān)于Java去掉小數(shù)點(diǎn)后面無(wú)效0的方案與建議,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件

    Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件

    這篇文章主要介紹了Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java Map.getOrDefault方法詳解

    Java Map.getOrDefault方法詳解

    Map.getOrDefault(Object key, V defaultValue)是Java中Map接口的一個(gè)方法,用于獲取指定鍵對(duì)應(yīng)的值,如果鍵不存在,則返回一個(gè)默認(rèn)值,這篇文章主要介紹了Java Map.getOrDefault方法詳解,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

通州市| 铜山县| 湖南省| 汨罗市| 南漳县| 积石山| 浮梁县| 石阡县| 玉田县| 奉贤区| 宜昌市| 永仁县| 马边| 海安县| 丰台区| 乌兰察布市| 靖州| 涿州市| 铁力市| 崇礼县| 吉水县| 大安市| 德清县| 南阳市| 文登市| 潜山县| 宽甸| 安阳县| 辽源市| 临夏市| 梓潼县| 苏州市| 罗源县| 六盘水市| 灵宝市| 孝昌县| 平乡县| 河津市| 竹溪县| 马公市| 抚顺县|