【设计模式-状态模式】

时间:2022-07-24
本文章向大家介绍【设计模式-状态模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

【导读】人在不同的状态下会做出不同的行为,比如愤怒的时候会做一些出格的事,高兴的时候会分享快乐,这种就是状态模式。

一、定义

允许一个对象在其内部状态发生改变时,改变其行为。

二、实例

比如视频有几种状态,播放、暂停、加速三个状态,视频在暂停状态的时候不能进行加速。

抽象视频状态对象:

public abstract class VideoState {
    1、包含一个视频上下文,是记录当前视频处于何种状态的
    protected VideoContext videoContext;

    public void setVideoContext(VideoContext videoContext) {
        this.videoContext = videoContext;
    }
    2、播放
    public abstract void play();
    3、加速
    public abstract void speed();
    4、暂停
    public abstract void pause();
}

播放状态:

public class PlayState extends VideoState {


    @Override
    public void play() {
        System.out.println("视屏处于播放状态");
    }

    @Override
    public void speed() {
        1、如果播放中需要加速,则将视频转成播放状态
        super.videoContext.setVideoState(VideoContext.SPEED_STATE);
    }

    @Override
    public void pause() {
        2、如果播放中需要暂停,则将视频转成状态状态
        super.videoContext.setVideoState(VideoContext.PAUSE_STATE);
    }
}

加速状态:

public class SpeedState extends VideoState {

    @Override
    public void play() {
       super.videoContext.setVideoState(VideoContext.PLAY_STATE);
    }

    @Override
    public void speed() {
        System.out.println("视屏处于加速状态");
    }

    @Override
    public void pause() {
        super.videoContext.setVideoState(VideoContext.PAUSE_STATE);
    }
}

暂停状态:

public class PauseState extends VideoState {

    @Override
    public void play() {
       super.videoContext.setVideoState(VideoContext.PLAY_STATE);
    }

    @Override
    public void speed() {
        throw new RuntimeException("暂停状态下不能加速");
    }

    @Override
    public void pause() {
        System.out.println("视屏处于暂停状态");
    }
}

视频上下文,记录视频当前处于何种状态:

public class VideoContext {

    private VideoState videoState;

    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 void setVideoState(VideoState videoState) {
        this.videoState = videoState;
        this.videoState.setVideoContext(this);
    }

    public VideoState getVideoState() {
        return videoState;
    }

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

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

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

}

测试类:

类图: