定义:允许一个对象在其内部状态改变时,改变它的行为;
类型:行为型;
适用场景
- 一个对象存在多个状态(不同状态行为不同),且状态可相互转换;
优点
- 将不同的状态隔离;
- 把各种状态的转换逻辑,分布到state的子类中,减少相互间依赖;
- 增加新的状态非常简单;
缺点
- 状态多的业务场景导致类数目增多,系统变复杂;
视频状态转换举例
// 视频状态抽象类
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,停止状态下不能加速