首页 > 其他分享 >状态模式

状态模式

时间:2024-01-31 12:22:06浏览次数:21  
标签:状态 void CourseVideoContext 模式 courseVideoContext Override public

  • 定义:允许一个对象在其内部状态改变时,改变它的行为
  • 类型:行为型
  • 适用场景:一个对象存在多个状态(不同状态下行为不同),且状态可以相互转换
  • 优点:
    • 将不同的状态隔离
    • 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖
    • 增加新的状态非常简单
  • 缺点:状态多的业务场景导致类数目增加,系统变复杂
  • 相关设计模式:
    • 状态模式和享元模式:有时候可以配合一起使用,可以使用享元模式在多个上下文角色之间共享这些状态实例

Coding

public class CourseVideoContext {

    private CourseVideoState courseVideoState;
    public final static PlayState PLAY_STATE = new PlayState();
    public final static StopState STOP_STATE = new StopState();
    public final static PauseState PAUSE_STATE = new PauseState();
    public final static SpeedState SPEED_STATE = new SpeedState();

    public CourseVideoState getCourseVideoState() {
        return courseVideoState;
    }

    public void setCourseVideoState(CourseVideoState courseVideoState) {
        this.courseVideoState = courseVideoState;
        this.courseVideoState.setCourseVideoContext(this);
    }

    public void play() {
        this.courseVideoState.play();
    }

    public void speed() {
        this.courseVideoState.speed();
    }

    public void stop() {
        this.courseVideoState.stop();
    }

    public void pause() {
        this.courseVideoState.pause();
    }
}
/**
 * 课程视频状态抽象类
 */
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();

}
/**
 * 暂停状态
 */
public class PauseState 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);
    }
}
/**
 * 播放状态
 */
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_STATE);
    }

    @Override
    public void stop() {
        super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
    }
}
/**
 * 快放状态
 */
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_STATE);
    }

    @Override
    public void stop() {
        super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
    }
}
/**
 * 停止状态
 */
public class StopState extends CourseVideoState {

    @Override
    public void play() {
        super.courseVideoContext.setCourseVideoState(CourseVideoContext.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("停止播放课程视频状态");
    }
}

 

UML

IMG_256

测试

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();
    }
}
========输出=======
当前状态:PlayState
当前状态:PauseState
当前状态:SpeedState
当前状态:StopState
ERROR 停止状态不能快进!!

 

源码中的应用

在一些业务场景中可以用状态模式,比如不同电商网站关于订单扭转的状态,可以自己设置一个和业务场景非常契合的状态机,还有一些比如我们的例子视频状态扭转、办公系统流程上的扭转等等都是和具体的业务场景相关的,可以使用上状态模式

标签:状态,void,CourseVideoContext,模式,courseVideoContext,Override,public
From: https://www.cnblogs.com/wangzhilei-src/p/17999007

相关文章

  • 访问者模式
    定义:封装作用于某数据结构(如List/Set/Map等)中的各元素操作补充定义:可以在不改变各元素类的前提下,定义作用于这些元素的操作类型:行为型适用场景:一个数据结构(如List/Set/Map等)包含很多类型对象数据结构与数据操作分离优点:增加新的操作很容易,即增加一个新的访问者缺点:增......
  • 深入浅出Java多线程(四):线程状态
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第四篇内容:线程状态。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代软件开发中,多线程编程已经成为提升应用程序性能和响应能力的关键技术。Java作为一门支持多线程编程的主流语言,其内置的丰富并......
  • AS-Windows 客户端不显示文件状态图标
    关键字状态图标、注册表适用产品AS5.0.xASEnterprise6.0.xASExpress6.0.xASCloud6.0.x问题描述打开AnyShareWindows客户端不显示文件状态图标。 问题影响AnyShareWindows客户端文件状态图标不显示,无法判断文件状态,影响用户使用体验。问题原因杀毒软件等原因导致文件状......
  • 使用IDEA打jar包三种方式 步骤(包含跳过测试模式)
    使用IDEA打jar包三种方式步骤(包含跳过测试模式)正文:方式一:网络最常见的打包方式。比较适用于普通项目打JAR包。方式二:比较适用于MAVEN项目打JAR包。方式三:maven界面。方式一:网络最常见的打包方式。比较适用于普通项目打JAR包。选中菜单栏中File–>ProjectStructure(文件–>项......
  • 设计模式一句话总结
    1.设计原则(SOLID原则)原则名字原则描述单一职责原则(S)功能只有一个开闭原则(O)开放扩展,关闭修改里氏替换原则(L)子类需要实现父类功能以保持兼容性接口隔离原则(I)不用的函数或者功能不要出现依赖倒置原则(D)细节依赖于抽象,约定优先迪米特法则只和朋友说话......
  • 状态码是什么,为什么要对状态码进行监测
    很多企业和网络从业者在进行开展互联网业务经常会遇到出现状态码,如400、200等等。像http状态码在我们浏览网页、发送请求和接受信息的过程中都起着非常重要的作用。而状态码监测是网络编程中非常重要的一个环节,通过它可以判断客户端的请求是否成功,服务器是否正常处理请求,以及可能出......
  • 双亲委派模式的优点
    一道面试题能不能自己写个类叫java.lang.System?答案:通常不可以,但可以采取另类方法达到这个需求。解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统......
  • 设计模式相关介绍
    设计模式使用原则主要包括以下几点:单一职责原则:一个类只负责一项职责,即一个类应该只有一个职责,该职责由类的一个职责来定义。这样可以提高类的可维护性和可复用性。开闭原则:软件实体应当对扩展开放,对修改封闭。也就是说,软件的功能扩展应当通过增加新代码来实现,而不是通过修改已......
  • openstack重置状态
    1.cindervolumesnapshot快照openstackvolumesnapshotset[--name<name>][--description<description>][--no-property][--property<key=value>[...]][--state<state>]<snapshot>-----------------......
  • iOS App审核状态和审核时间管理指南
    引言对于一款开发完成并准备上架的iOS应用程序来说,通过苹果公司的审核是非常重要的一步。苹果公司会对应用程序进行严格的检查,以确保应用程序的质量和安全性。本文将介绍iOS应用程序审核的流程和时间,希望能够帮助开发者更好地了解和处理审核过程中的问题。添加图片注释,不超......