zoukankan      html  css  js  c++  java
  • 状态模式

    一、状态模式介绍

    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

  • 相关阅读:
    javsscript闭包的一种使用场景--沙箱
    toString()方法,与call()方法结合;用来进行数据类型检测
    [学习笔记]数论(二)
    [模板]平面最近点对
    [bzoj1670][Usaco2006 Oct]Building the Moat
    [模板]计算几何(一)
    [日常训练]string
    [bzoj3626][LNOI2014]LCA
    [bzoj2732][HNOI2012]射箭
    [学习笔记]半平面交
  • 原文地址:https://www.cnblogs.com/weixk/p/13636979.html
Copyright © 2011-2022 走看看