状态模式

状态模式属于行为型设计模式

定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为

模式类图

角色:

  1. 抽象状态接口:State定义抽象状态接口
  2. 具体状态实现:ConcreteState实现State接口,不同状态实现逻辑不同
  3. 环境类:Context持有一个状态实例

看类图就知道这个模式很简单了

优点

  1. 结构清晰,遵循设计原则,每种状态都对应一个实现类,同一扩展
  2. 封装性非常好,状态变换放置到环境类的内部来实现

缺点

如果类的成员变量过多,多次保存,会消耗一定的内存

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

抽象状态接口
/**
 * @auther: chenmingyu
 * @date: 2019/3/26 19:42
 * @description: 状态接口
 */
public interface Stateable {

    /**
     * 搞事情
     */
    void doSometing();
}
具体状态实现

学习状态

/**
 * @author: chenmingyu
 * @date: 2019/3/26 19:44
 * @description:
 */
public class StudyState implements Stateable{

    @Override
    public void doSometing() {
        System.out.println("学习状态,就要学习");
    }
}

游戏状态

/**
 * @author: chenmingyu
 * @date: 2019/3/26 19:43
 * @description: 游戏状态
 */
public class GameState implements Stateable {

    @Override
    public void doSometing() {
        System.out.println("游戏状态,就打游戏");
    }
}
环境类
/**
 * @author: chenmingyu
 * @date: 2019/3/26 19:45
 * @description: 环境类
 */
@Data
public class Context {
    /**
     * 持有具体状态实例
     */
    private Stateable stateable;
}
验证
public static void main(String[] args) {
    Context context = new Context();

    Stateable studyState = new StudyState();
    context.setStateable(studyState);
    context.getStateable().doSometing();

    Stateable gameState = new GameState();
    context.setStateable(gameState);
    context.getStateable().doSometing();
}

输出

学习状态,就要学习
游戏状态,就打游戏

参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193607

推荐阅读:23种设计模式详解