【导读】人在不同的状态下会做出不同的行为,比如愤怒的时候会做一些出格的事,高兴的时候会分享快乐,这种就是状态模式。
一、定义
允许一个对象在其内部状态发生改变时,改变其行为。
二、实例
比如视频有几种状态,播放、暂停、加速三个状态,视频在暂停状态的时候不能进行加速。
抽象视频状态对象:
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();
}
}
测试类:
类图: