目录
一、状态模式的定义与类型
- 一、状态模式的定义与类型
- 二、状态模式的适用场景
- 三、状态模式的优点
- 四、状态模式的缺点
- 五、状态模式相关设计模式
- 六、状态模式示例
1、定义
- 允许一个对象在其内部状态改变时,改变它的行为
2、类型
- 行为型
- 一个对象存在多个状态(不同状态下行为不同),且状态可相互转换
- 将不同的状态隔离
- 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖
- 新增新的状态非常简单
- 状态多的业务场景导致类目增加,系统变复杂
- 状态模式和享元模式
以切换视频课程的状态为例进行代码演示
1、代码结构如下:
2、定义一个抽象的课程视频状态类
package com.rf.designPatterns.behavioral.state;
/**
* @description: 定义一个抽象的课程视频状态类
* @author: xz
*/
public abstract class CourseVideoState {
protected CourseVideoContext courseVideoContext;
public void setCourseVideoContext(CourseVideoContext courseVideoContext) {
this.courseVideoContext = courseVideoContext;
}
//播放功能方法
public abstract void play();
//快进功能方法
public abstract void speed();
//暂停功能方法
public abstract void pause();
//停止功能方法
public abstract void stop();
}
2、定义一个课程视频上下文类
package com.rf.designPatterns.behavioral.state;
/**
* @description: 定义一个课程视频上下文类
* @author: xz
*/
public class CourseVideoContext {
private CourseVideoState courseVideoState;
//getter、setter方法
public CourseVideoState getCourseVideoState() {
return courseVideoState;
}
public void setCourseVideoState(CourseVideoState courseVideoState) {
this.courseVideoState = courseVideoState;
this.courseVideoState.setCourseVideoContext(this);
}
//声明常量
public static final PlayState PLAY_STATE=new PlayState();
public static final SpeedState SPEED_STATE=new SpeedState();
public static final PauseSate PAUSE_SATE=new PauseSate();
public static final StopState STOP_STATE=new StopState();
public void play(){
this.courseVideoState.play();
}
public void speed(){
this.courseVideoState.speed();
}
public void pause(){
this.courseVideoState.pause();
}
public void stop(){
this.courseVideoState.stop();
}
}
3、定义一个播放功能状态类
package com.rf.designPatterns.behavioral.state;
/**
* @description: 定义一个播放功能状态类
* @author: xz
*/
public class PlayState extends CourseVideoState{
@Override
public void play() {
System.out.println("正常播放课程视频状态");
}
@Override
public void speed() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);
}
@Override
public void pause() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_SATE);
}
@Override
public void stop() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
}
}
4、定义一个快进功能状态类
package com.rf.designPatterns.behavioral.state;
/**
* @description: 定义一个快进功能状态类
* @author: xz
*/
public class SpeedState extends CourseVideoState{
@Override
public void play() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
}
@Override
public void speed() {
System.out.println("快进播放课程视频状态");
}
@Override
public void pause() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_SATE);
}
@Override
public void stop() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
}
}
5、定义一个暂停功能状态类
package com.rf.designPatterns.behavioral.state;
/**
* @description: 定义一个暂停功能状态类
* @author: xz
*/
public class PauseSate extends CourseVideoState{
@Override
public void play(){
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
}
@Override
public void speed(){
super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);
}
@Override
public void pause() {
System.out.println("暂停播放课程视频状态");
}
@Override
public void stop() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
}
}
6、定义一个停止功能状态类
package com.rf.designPatterns.behavioral.state;
/**
* @description: 定义一个停止功能状态类
* @author: xz
*/
public class StopState extends CourseVideoState{
@Override
public void play() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
}
@Override
public void speed() {
System.out.println("停止状态不能快进");
}
@Override
public void pause() {
System.out.println("停止状态不能暂停");
}
@Override
public void stop() {
System.out.println("停止播放课程视频状态");
}
}
7、定义一个状态模式的测试类
package com.rf.designPatterns.behavioral.state;
/**
* @description: 定义一个状态模式的测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
//声明一个上下文
CourseVideoContext courseVideoContext=new CourseVideoContext();
//第一个设置播放视频功能
courseVideoContext.setCourseVideoState(new PlayState());
System.out.println("当前状态:"+courseVideoContext.getCourseVideoState().getClass().getSimpleName());
//设置暂停播放视频功能
courseVideoContext.pause();
System.out.println("当前状态:"+courseVideoContext.getCourseVideoState().getClass().getSimpleName());
//设置快进播放视频功能
courseVideoContext.speed();
System.out.println("当前状态:"+courseVideoContext.getCourseVideoState().getClass().getSimpleName());
//设置停止播放视频功能
courseVideoContext.stop();
System.out.println("当前状态:"+courseVideoContext.getCourseVideoState().getClass().getSimpleName());
//停止播放视频在调用快进功能
courseVideoContext.speed();
}
}
8、运行测试类,输出结果如下:
9、UML类图如下: