狀態模式

定義:允許一個對象在其內部狀態改變時,改變它的行爲;
類型:行爲型;

適用場景
  1. 一個對象存在多個狀態(不同狀態行爲不同),且狀態可相互轉換;
優點
  1. 將不同的狀態隔離;
  2. 把各種狀態的轉換邏輯,分佈到state的子類中,減少相互間依賴;
  3. 增加新的狀態非常簡單;
缺點
  1. 狀態多的業務場景導致類數目增多,系統變複雜;
視頻狀態轉換舉例
// 視頻狀態抽象類
public abstract class VedioState {

    protected VedioContext vedioContext;

    public void setVedioContext(VedioContext vedioContext) {
        this.vedioContext = vedioContext;
    }

    abstract void play();
    abstract void pause();
    abstract void stop();
    abstract void speed();

}

// 視頻上下文
public class VedioContext {
    private VedioState vedioState;

    public static final PlayState PLAY_STATE = new PlayState();
    public static final SpeedState SPEED_STATE = new SpeedState();
    public static final PauseState PAUSE_STATE = new PauseState();
    public static final StopState STOP_STATE = new StopState();

    public VedioState getVedioState() {
        return vedioState;
    }

    public void setVedioState(VedioState vedioState) {
        this.vedioState = vedioState;
        this.vedioState.setVedioContext(this);
    }

    public void play(){
        this.vedioState.play();
    }

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

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

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

// 播放狀態
public class PlayState extends VedioState {
    @Override
    void play() {
        System.out.println("正常播放視頻狀態");
    }

    @Override
    void pause() {
        super.vedioContext.setVedioState(VedioContext.PAUSE_STATE);
    }

    @Override
    void stop() {
        super.vedioContext.setVedioState(VedioContext.STOP_STATE);
    }

    @Override
    void speed() {
        super.vedioContext.setVedioState(VedioContext.SPEED_STATE);
    }
}

// 暫停狀態
public class PauseState extends VedioState {

    @Override
    void pause() {
        System.out.println("視頻處於暫停狀態");
    }

    @Override
    void play() {
        super.vedioContext.setVedioState(VedioContext.PLAY_STATE);
    }

    @Override
    void stop() {
        super.vedioContext.setVedioState(VedioContext.STOP_STATE);
    }

    @Override
    void speed() {
        super.vedioContext.setVedioState(VedioContext.SPEED_STATE);
    }
}

// 加速狀態
public class SpeedState extends VedioState {
    @Override
    void play() {
        super.vedioContext.setVedioState(VedioContext.PLAY_STATE);
    }

    @Override
    void pause() {
        super.vedioContext.setVedioState(VedioContext.PAUSE_STATE);
    }

    @Override
    void stop() {
        super.vedioContext.setVedioState(VedioContext.STOP_STATE);
    }

    @Override
    void speed() {
        System.out.println("加速播放視頻狀態");
    }
}

// 停止狀態
public class StopState extends VedioState {
    @Override
    void play() {
        super.vedioContext.setVedioState(VedioContext.PLAY_STATE);
    }

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

    @Override
    void speed() {
        System.out.println("ERROR,停止狀態下不能加速");
    }

    @Override
    void stop() {
        System.out.println("視頻處於停止狀態");
    }
}

// 測試類
public class Test {
    public static void main(String[] args) {
        VedioContext vedioContext = new VedioContext();

        vedioContext.setVedioState(new PlayState());
        System.out.println("當前狀態:"+vedioContext.getVedioState().getClass().getSimpleName());

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

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

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

        vedioContext.speed();
    }
}

// 測試結果
當前狀態:PlayState
當前狀態:PauseState
當前狀態:SpeedState
當前狀態:StopState
ERROR,停止狀態下不能加速
UML類圖

視頻狀態類圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章