容許一個對象在其內部狀態改變時,改變它的行爲
類型:行爲型設計模式
一個對象存在多個狀態(不一樣狀態下行爲不一樣),且狀態可相互轉換ide
將不一樣的狀態隔離
把各類狀態的轉換邏輯,分佈到State的子類中,減小相互間依賴
增長新的狀態很是簡單測試
狀態多的業務場景緻使類數目增長,系統變複雜this
狀態模式和享元模式 有時候能夠配合進行使用設計
模擬場景:看視頻時,能夠切換爲播放狀態、暫停狀態、快進狀態、中止狀態code
視頻狀態抽象類:視頻
public abstract class VideoVideoState { // 與上下文 互相嵌套 protected VideoStateContext videoStateContext; public void setVideoStateContext(VideoStateContext videoStateContext) { this.videoStateContext = videoStateContext; } public abstract void paly(); public abstract void speed(); public abstract void pause(); public abstract void stop(); }
播放狀態類:對象
public class PlayState extends VideoVideoState { @Override public void paly() { System.out.println("正常播放課程視頻的狀態"); } @Override public void speed() { System.out.println("快進了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.SPEED_STATE); } @Override public void pause() { System.out.println("暫停了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.PAUSE_STATE); } @Override public void stop() { System.out.println("中止了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.STOP_STATE); } }
暫停狀態類:blog
public class PauseState extends VideoVideoState { @Override public void paly() { System.out.println("播放了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.PLAY_STATE); } @Override public void speed() { System.out.println("快進了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.SPEED_STATE); } @Override public void pause() { System.out.println("暫停播放課程視頻的狀態"); } @Override public void stop() { System.out.println("中止了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.STOP_STATE); } }
快進狀態類:get
public class SpeedState extends VideoVideoState { @Override public void paly() { System.out.println("播放了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.PLAY_STATE); } @Override public void speed() { System.out.println("快進播放課程視頻的狀態"); } @Override public void pause() { System.out.println("暫停了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.PAUSE_STATE); } @Override public void stop() { System.out.println("中止了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.STOP_STATE); } }
中止狀態類:
public class StopState extends VideoVideoState { @Override public void paly() { System.out.println("播放了視頻"); super.videoStateContext.setVideoVideoState(VideoStateContext.PLAY_STATE); } @Override public void speed() { System.out.println("ERROR 中止狀態不能快進!"); } @Override public void pause() { System.out.println("ERROR 中止狀態不能暫停!"); } @Override public void stop() { System.out.println("中止播放課程視頻的狀態"); } }
視頻狀態上下文(用於管理狀態):
public class VideoStateContext { // 與視頻狀態類 互相嵌套 private VideoVideoState videoVideoState; 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 final static StopState STOP_STATE = new StopState(); public VideoStateContext() { // 設置默認中止狀態 this.videoVideoState = STOP_STATE; this.videoVideoState.setVideoStateContext(this); } public VideoVideoState getVideoVideoState() { return videoVideoState; } public void setVideoVideoState(VideoVideoState videoVideoState) { // 切換狀態 this.videoVideoState = videoVideoState; this.videoVideoState.setVideoStateContext(this); } public void paly() { this.videoVideoState.paly(); } public void speed() { this.videoVideoState.speed(); } public void pause() { this.videoVideoState.pause(); } public void stop() { this.videoVideoState.stop(); } }
測試類:
public class Test { public static void main(String[] args) { VideoStateContext videoStateContext = new VideoStateContext(); videoStateContext.paly(); System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName()); videoStateContext.pause(); System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName()); videoStateContext.speed(); System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName()); videoStateContext.stop(); System.out.println("當前狀態:" + videoStateContext.getVideoVideoState().getClass().getSimpleName()); videoStateContext.speed(); } }
輸出:
播放了視頻
當前狀態:PlayState
暫停了視頻
當前狀態:PauseState
快進了視頻
當前狀態:SpeedState
中止了視頻
當前狀態:StopState
ERROR 中止狀態不能快進!
類圖: