版权声明:本文为博主原创文章,转载请注明出处 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 方式+内存分析>课程
四人帮<设计模式>