您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——状态模式

小志的博客 发布时间:2021-01-25 22:35:45 ,浏览量:0

目录
    • 一、状态模式的定义与类型
    • 二、状态模式的适用场景
    • 三、状态模式的优点
    • 四、状态模式的缺点
    • 五、状态模式相关设计模式
    • 六、状态模式示例

一、状态模式的定义与类型

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类图如下: 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.1015s