狀態模式

1、狀態模式介紹

一、定義與類型

容許一個對象在其內部狀態改變時,改變它的行爲
類型:行爲型設計模式

二、適用場景

一個對象存在多個狀態(不一樣狀態下行爲不一樣),且狀態可相互轉換ide

三、優勢

將不一樣的狀態隔離
把各類狀態的轉換邏輯,分佈到State的子類中,減小相互間依賴
增長新的狀態很是簡單測試

四、缺點

狀態多的業務場景緻使類數目增長,系統變複雜this

五、相關設計模式

狀態模式和享元模式 有時候能夠配合進行使用設計

2、代碼示例

模擬場景:看視頻時,能夠切換爲播放狀態、暫停狀態、快進狀態、中止狀態code

視頻狀態抽象類:視頻

public abstract class VideoVideoState {
    // 與上下文 互相嵌套
    protected VideoStateContext videoStateContext;

    public void setVideoStateContext(VideoStateContext videoStateContext) {
        this.videoStateContext = videoStateContext;
    }

    public abstract void paly();

    public abstract void speed();

    public abstract void pause();

    public abstract void stop();
}

播放狀態類:對象

public class PlayState extends VideoVideoState {
    @Override
    public void paly() {
        System.out.println("正常播放課程視頻的狀態");
    }

    @Override
    public void speed() {
        System.out.println("快進了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.SPEED_STATE);
    }

    @Override
    public void pause() {
        System.out.println("暫停了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.PAUSE_STATE);
    }

    @Override
    public void stop() {
        System.out.println("中止了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.STOP_STATE);
    }
}

暫停狀態類:blog

public class PauseState extends VideoVideoState {
    @Override
    public void paly() {
        System.out.println("播放了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.PLAY_STATE);
    }

    @Override
    public void speed() {
        System.out.println("快進了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.SPEED_STATE);
    }

    @Override
    public void pause() {
        System.out.println("暫停播放課程視頻的狀態");
    }

    @Override
    public void stop() {
        System.out.println("中止了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.STOP_STATE);
    }
}

快進狀態類:get

public class SpeedState extends VideoVideoState {
    @Override
    public void paly() {
        System.out.println("播放了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.PLAY_STATE);
    }

    @Override
    public void speed() {
        System.out.println("快進播放課程視頻的狀態");
    }

    @Override
    public void pause() {
        System.out.println("暫停了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.PAUSE_STATE);
    }

    @Override
    public void stop() {
        System.out.println("中止了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.STOP_STATE);
    }
}

中止狀態類:

public class StopState extends VideoVideoState {
    @Override
    public void paly() {
        System.out.println("播放了視頻");
        super.videoStateContext.setVideoVideoState(VideoStateContext.PLAY_STATE);
    }

    @Override
    public void speed() {
        System.out.println("ERROR 中止狀態不能快進!");
    }

    @Override
    public void pause() {
        System.out.println("ERROR 中止狀態不能暫停!");
    }

    @Override
    public void stop() {
        System.out.println("中止播放課程視頻的狀態");
    }
}

視頻狀態上下文(用於管理狀態):

public class VideoStateContext {
    // 與視頻狀態類 互相嵌套
    private VideoVideoState videoVideoState;
    public final static PlayState PLAY_STATE = new PlayState();
    public final static SpeedState SPEED_STATE = new SpeedState();
    public final static PauseState PAUSE_STATE = new PauseState();
    public final static StopState STOP_STATE = new StopState();

    public VideoStateContext() {
        // 設置默認中止狀態
        this.videoVideoState = STOP_STATE;
        this.videoVideoState.setVideoStateContext(this);
    }

    public VideoVideoState getVideoVideoState() {
        return videoVideoState;
    }

    public void setVideoVideoState(VideoVideoState videoVideoState) {
        // 切換狀態
        this.videoVideoState = videoVideoState;
        this.videoVideoState.setVideoStateContext(this);
    }

    public void paly() {
        this.videoVideoState.paly();
    }

    public void speed() {
        this.videoVideoState.speed();
    }

    public void pause() {
        this.videoVideoState.pause();
    }

    public void stop() {
        this.videoVideoState.stop();
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        VideoStateContext videoStateContext = new VideoStateContext();

        videoStateContext.paly();

        System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName());

        videoStateContext.pause();
        System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName());

        videoStateContext.speed();
        System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName());

        videoStateContext.stop();
        System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName());

        videoStateContext.speed();
    }
}

輸出:
播放了視頻
當前狀態:PlayState
暫停了視頻
當前狀態:PauseState
快進了視頻
當前狀態:SpeedState
中止了視頻
當前狀態:StopState
ERROR 中止狀態不能快進!

類圖:

3、 源碼示例

一、jsf中的LifeCycle

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息