• 状态模式


    一、状态模式介绍

    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

  • 相关阅读:
    二叉树遍历
    php环境搭建工具推荐
    laravel框架包资源分享
    memcached配置
    双引号转义问题
    PHP命名空间
    正则表达式
    2017,起航!
    关于大数据量下进行大数据展示的杂谈
    mysql空数据的处理
  • 原文地址:https://www.cnblogs.com/weixk/p/13636979.html
Copyright © 2020-2023  润新知