2020-09-09

状态模式

一、状态模式介绍

1、定义与类型

允许一个对象在其内部状态改变时,改变它的行为
类型:行为型

2、适用场景

一个对象存在多个状态(不同状态下行为不同),且状态可相互转换

3、优点

将不同的状态隔离
把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖
增加新的状态非常简单

4、缺点

状态多的业务场景导致类数目增加,系统变复杂

5、相关设计模式

状态模式和享元模式 有时候可以配合进行使用

二、代码示例

模拟场景:看视频时,可以切换为播放状态、暂停状态、快进状态、停止状态

视频状态抽象类:

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); }}

暂停状态类:

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); }}

快进状态类:

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 停止状态不能快进!

类图:

三、 源码示例

1、jsf中的LifeCycle

状态模式prime day宠物用品数据解读FBA实战赢NBA门票 | Wish双11要大促!更多机密在现场继印度、美国、日本之后,澳大利亚也要限制TikTok了?TikTok前途未卜谨防踩坑!亚马逊3大种类侵权 !!eBay中英文版运营教程Facebook布局印度电商市场,将与亚马逊争夺线下零售商?

No comments:

Post a Comment