个人技术分享

一、状态模式
1、状态模式
状态模式(State Pattern)是一种行为型模式。 它允许一个对象在其内部状态改变时改变它的行为。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是允许一个对象在其内部状态改变时自动改变它的行为。对象看起来似乎修改了它的类。

2、实现思路
(1)、定义状态类的规范(行为的方法)
(2)、编写每一种状态的实现类(开,关等),实现状态的规范。如果方法行为结果和当前状态一致,直接触发行为方法;如果不一致,需要先修改状态,在促发行为方法。
(3)、定义实体对象,内置状态的属性类。实现促发行为的方法,促发修改状态的方法等。

二、代码示例
1、示例场景
电脑的对象,调用打开方法,修改状态促发行为。调用关闭的方法,修改状态促发行为。
2、代码示例

// 1、定位状态的规范(各种可能的行为方法)
public interface ComputerState {
    public void turnOn(ComputerContext context);
    public void turnOff(ComputerContext context);
}
// 2.1、编写开启状态实现类
public class ComputerOnState implements ComputerState {
    @Override
    public void turnOn(ComputerContext context) {
        System.out.println("开启电脑的行为");      // 之前是开启状态一致时,不用切换状态,直接触发行为
    }

    @Override
    public void turnOff(ComputerContext context) {
        context.changeState(new ComputerOffState());      // 不一致,切换状态
        System.out.println("关闭电脑的行为");             // 触发行为
    }
}
// 2.2、编写关闭状态实现类
public class ComputerOffState implements ComputerState {
    @Override
    public void turnOn(ComputerContext context) {
        context.changeState(new ComputerOnState());
        System.out.println("开启电脑的行为");
    }

    @Override
    public void turnOff(ComputerContext context) {
        System.out.println("关闭电脑的行为");
    }
}
// 3、编写电脑上下文对象
public class ComputerContext {
    ComputerState computerState;

    public ComputerContext(ComputerState computerState){
        this.computerState = computerState;
    }

    public void changeState(ComputerState computerState){
        this.computerState = computerState;
    }

    public void turnOn(){
        computerState.turnOn(this);
    }

    public void turnOff(){
        computerState.turnOff(this);
    }
}
// 4、测试
 public static void main(String[] args) {
        ComputerContext computerContext = new ComputerContext(new ComputerOffState());  // 初始化为关闭状态的电脑
        computerContext.turnOn();    // 实际是改变状态和促发行为
        computerContext.turnOn();    
        computerContext.turnOff();
    }

运行结果:
在这里插入图片描述
总结:
状态模式,当一个对象状态改变需要触发不同的行为操作时比较推荐使用。主要套路就是把所有状态由原来的单一字段抽成具体的类,通过设置状态类来触发对应的行为方法。

学海无涯苦作舟!!!