设计模式-状态模式(State)

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/love905661433/article/details/84478507

概述

定义 : 允许一个对象在其内部状态改变时, 改变它的行为

类型 : 行为型

适用场景

  • 一个对象存在多个状态(不同状态下行为不同), 且状态可相互转换

优点

  • 将不同的状态隔离
  • 把各种状态的转换逻辑分布到State子类中, 减少相互间依赖
  • 增加新的状态很简单

缺点

  • 状态多的业务场景导致类数目增加, 系统变复杂

模式角色

  • Context(环境) :

    • 定义客户感兴趣的接口
    • 维护一个ConcreteState子类的实例,这个实例定义当前状态。
  • State(状态) : 定义一个接口以封装与Context的一个特定状态相关的行为。

  • ConcreteState subclasses(具体状态子类) : 每一子类实现一个与Context的一个状态相关的行为。

代码实现

场景

播放器播放,暂停,倍速播放,停止状态之间转换, 停止之后不能倍速播放和暂停, 其他状态都可以互相转换

UML类图

在这里插入图片描述

代码

State(状态) :

/**
 * State(状态)
 *
 * @author 七夜雪
 * @create 2018-11-25 9:33
 */
public interface State {

    public void play(Player player);
    public void pause(Player player);
    public void speed(Player player);
    public void stop(Player player);


}

ConcreteState subclasses(具体状态子类) :

/**
 * 暂停状态
 * ConcreteState subclasses(具体状态子类)
 *
 * @author 七夜雪
 * @create 2018-11-25 9:34
 */
public class PauseState implements State {

    @Override
    public void play(Player player) {
        player.setState(StateEnum.PLAY);
    }

    @Override
    public void pause(Player player) {
        System.out.println("视频暂停中...");
    }

    @Override
    public void speed(Player player) {
        player.setState(StateEnum.SPEED);
    }

    @Override
    public void stop(Player player) {
        player.setState(StateEnum.STOP);
    }
}
/**
 * 播放状态
 * ConcreteState subclasses(具体状态子类)
 *
 * @author 七夜雪
 * @create 2018-11-25 9:34
 */
public class PlayState implements State {

    @Override
    public void play(Player player) {
        System.out.println("视频播放中...");
    }

    @Override
    public void pause(Player player) {
        player.setState(StateEnum.PAUSE);
    }

    @Override
    public void speed(Player player) {
        player.setState(StateEnum.SPEED);
    }

    @Override
    public void stop(Player player) {
        player.setState(StateEnum.STOP);
    }
}
/**
 * 加速播放状态
 * ConcreteState subclasses(具体状态子类)
 *
 * @author 七夜雪
 * @create 2018-11-25 9:35
 */
public class SpeedState implements State {

    @Override
    public void play(Player player) {
        player.setState(StateEnum.PLAY);
    }

    @Override
    public void pause(Player player) {
        player.setState(StateEnum.PAUSE);
    }

    @Override
    public void speed(Player player) {
        System.out.println("视频加速播放中...");
    }

    @Override
    public void stop(Player player) {
        player.setState(StateEnum.STOP);
    }
}
/**
 * 停止状态
 * ConcreteState subclasses(具体状态子类)
 * @author 七夜雪
 * @create 2018-11-25 9:35
 */
public class StopState implements State {

    @Override
    public void play(Player player) {
        player.setState(StateEnum.PLAY);
    }

    @Override
    public void pause(Player player) {
        System.err.println("停止状态不能暂停...");
    }

    @Override
    public void speed(Player player) {
        System.err.println("停止状态不能加速播放...");
    }

    @Override
    public void stop(Player player) {
        player.setState(StateEnum.STOP);
    }
}

枚举类, 用于辅助:

/**
 * 枚举类
 *
 * @author 七夜雪
 * @create 2018-11-25 9:39
 */
public interface StateEnum {
    public final static State PLAY = new PlayState();
    public final static State PAUSE = new PauseState();
    public final static State SPEED = new SpeedState();
    public final static State STOP = new StopState();
}

Context角色 :

/**
 * @author 七夜雪
 * @create 2018-11-25 9:33
 */
public class Player {
    private State state;

    public Player(State state) {
        this.state = state;
    }

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

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

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

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


    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}

测试代码 :

    public static void main(String[] args) {
        Player player = new Player(StateEnum.PLAY);
        System.out.println("Player状态 : " + player.getState().getClass().getSimpleName());
        player.pause();
        System.out.println("Player状态 : " + player.getState().getClass().getSimpleName());
        player.speed();
        System.out.println("Player状态 : " + player.getState().getClass().getSimpleName());
        player.stop();
        System.out.println("Player状态 : " + player.getState().getClass().getSimpleName());
        player.speed();
    }

测试结果 :

Player状态 : PlayState
Player状态 : PauseState
Player状态 : SpeedState
Player状态 : StopState
停止状态不能加速播放...
Player状态 : StopState

本文参考:
慕课网<java设计模式精讲 Debug 方式+内存分析>课程
四人帮<设计模式>

猜你喜欢

转载自blog.csdn.net/love905661433/article/details/84478507
今日推荐