定義:允許一個對象在其內部狀態改變時,改變它的行爲;
類型:行爲型;
適用場景
- 一個對象存在多個狀態(不同狀態行爲不同),且狀態可相互轉換;
優點
- 將不同的狀態隔離;
- 把各種狀態的轉換邏輯,分佈到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,停止狀態下不能加速