专栏首页Liusy01【设计模式-状态模式】

【设计模式-状态模式】

【导读】人在不同的状态下会做出不同的行为,比如愤怒的时候会做一些出格的事,高兴的时候会分享快乐,这种就是状态模式。

一、定义

允许一个对象在其内部状态发生改变时,改变其行为。

二、实例

比如视频有几种状态,播放、暂停、加速三个状态,视频在暂停状态的时候不能进行加速。

抽象视频状态对象:

public abstract class VideoState {
    1、包含一个视频上下文,是记录当前视频处于何种状态的
    protected VideoContext videoContext;

    public void setVideoContext(VideoContext videoContext) {
        this.videoContext = videoContext;
    }
    2、播放
    public abstract void play();
    3、加速
    public abstract void speed();
    4、暂停
    public abstract void pause();
}

播放状态:

public class PlayState extends VideoState {


    @Override
    public void play() {
        System.out.println("视屏处于播放状态");
    }

    @Override
    public void speed() {
        1、如果播放中需要加速,则将视频转成播放状态
        super.videoContext.setVideoState(VideoContext.SPEED_STATE);
    }

    @Override
    public void pause() {
        2、如果播放中需要暂停,则将视频转成状态状态
        super.videoContext.setVideoState(VideoContext.PAUSE_STATE);
    }
}

加速状态:

public class SpeedState extends VideoState {

    @Override
    public void play() {
       super.videoContext.setVideoState(VideoContext.PLAY_STATE);
    }

    @Override
    public void speed() {
        System.out.println("视屏处于加速状态");
    }

    @Override
    public void pause() {
        super.videoContext.setVideoState(VideoContext.PAUSE_STATE);
    }
}

暂停状态:

public class PauseState extends VideoState {

    @Override
    public void play() {
       super.videoContext.setVideoState(VideoContext.PLAY_STATE);
    }

    @Override
    public void speed() {
        throw new RuntimeException("暂停状态下不能加速");
    }

    @Override
    public void pause() {
        System.out.println("视屏处于暂停状态");
    }
}

视频上下文,记录视频当前处于何种状态:

public class VideoContext {

    private VideoState videoState;

    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 void setVideoState(VideoState videoState) {
        this.videoState = videoState;
        this.videoState.setVideoContext(this);
    }

    public VideoState getVideoState() {
        return videoState;
    }

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

    public void pause(){
        this.videoState.pause();
    }

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

}

测试类:

类图:

本文分享自微信公众号 - Liusy01(Liusy_01),作者:Liusy01

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Netty之MessagePack编解码框架

    一个高效的二进制序列化格式。它让你像JSON一样可以在各种语言之间交换数据。但是它比JSON更快、更小的整数会被编码成一个字节,短的字符串仅仅只需要比它的长度多...

    Liusy
  • Netty之TCP粘包/拆包

    TCP会根据缓冲区的实际大小情况进行包的拆分和合并,所谓粘包,就是将多个小的包封装成一个大的包进行发送。拆包,即是将一个超过缓冲区可用大小的包拆分成多个包进行发...

    Liusy
  • 【设计模式-工厂相关模式】

    定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

    Liusy
  • Java设计模式总汇一

    PS:首先我们要带着问题读文章 什么是设计模式 为什么要用设计模式 使用设计模式有什么好处   设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设...

    cMusketeer
  • RxBinding详解: 规范而强大的安卓UI响应式编程

    原文:Reactive Android UI Programming with RxBinding 作者:Donn Felker 翻译:DreamWinte...

    冰之角
  • 03.如何实现一个遥控器-命令模式

    悟空聊架构
  • Netty之MessagePack编解码框架

    一个高效的二进制序列化格式。它让你像JSON一样可以在各种语言之间交换数据。但是它比JSON更快、更小的整数会被编码成一个字节,短的字符串仅仅只需要比它的长度多...

    Liusy
  • Command模式入门

    提起Command模式,我想没有什么比遥控器的例子更能说明问题了,本文将通过它来一步步实现GOF的Command模式。

    张子阳
  • Java 多线程编程(上)

    https://blog.csdn.net/weixin_44510615/article/details/102617286

    润森
  • Google VR技术大揭秘

    VR 虚拟现实(Virtual Reality)技术是一种可以创建和体验虚拟世界的计算机仿真系统,它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三...

    xiangzhihong

扫码关注云+社区

领取腾讯云代金券