状态模式

一、状态模式介绍

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

(0)

相关推荐

  • 行为型模式:状态模式

    十一大行为型模式之八:状态模式. 简介 姓名 :状态模式 英文名 :State Pattern 价值观 :有啥事让状态我来维护 个人介绍 : Allow an object to alter its ...

  • 设计模式(二十二)——状态模式(APP抽奖活动+借贷平台源码剖析)

    24.1 APP 抽奖活动问题 请编写程序完成 APP 抽奖活动 具体要求如下: 1) 假如每参加一次这个活动要扣除用户 50 积分,中奖概率是 10% 2) 奖品数量固定,抽完就不能抽奖 3) 活动 ...

  • PHP设计模式之状态模式

    PHP设计模式之状态模式 状态模式从字面上其实并不是很好理解.这里的状态是什么意思呢?保存状态?那不就是备忘录模式了.其实,这里的状态是类的状态,通过改变类的某个状态,让这个类感觉像是换了一个类一样. ...

  • [PHP小课堂]PHP设计模式之状态模式

    [PHP小课堂]PHP设计模式之状态模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式-行为型-状态模式

    状态模式(State): 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到,然后使用if else语句来做状态判断来进行不同情况的处理 ...

  • 设计模式之状态模式(二)

    在上一次的文章里,我们看到,需求的变更,迫使我们需要重新改造现有的糖果机代码来符合这个新提的需求.但是,也并没有难倒我们,至少我们在文末给出了思路和类图,不知道你想的怎么样了呢. 我们不来虚的,直接进 ...

  • 大话设计模式笔记(十三)の状态模式

    举个栗子 问题描述 上班的日子,上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬.根据时间的不同体现不同的工作状态. 简单实现 Work /** * 工作类 * Created by callmeDev ...

  • 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

  • 简说设计模式——状态模式

    一.什么是状态模式 状态这个词汇我们并不陌生,在日常生活中,不同时间就有不同的状态,早上起来精神饱满,中文想睡觉,下午又渐渐恢复,晚上可能精神更旺也可能耗费体力只想睡觉,这一天中就对应着不同的状态.或 ...

  • Matlab状态模式

    状态模式就是将状态的条件判断语句转化成其函数重写形式,利用了面向对象语言的多态性,本文根据https://blog.csdn.net/lm324114/article/details/78819602 ...