状态模式

2022-09-08 15:05:58 浏览数 (1)

最近在看状态机,先逐步从状态模式学起

1. 状态模式(State Pattern)

允许对象在内部状态改变时改变它的行为, 对象看起来好象改了它的类。在传统中编程中使用 if-else 对所有情况判断并作出对应的行为,这不仅违背了开闭原则,而且会显得臃肿难于阅读和维护,状态模式是用来解决这个问题的

状态模式的组成:

  • State:状态接口
  • ConcreteState:状态实现类
  • Context:环境

2. 流程

灯有打开和关闭两种状态,我们用灯的开关状态来说明状态模式:(下面没有使用状态模式)

代码语言:javascript复制
public class Light {
    
    private String state;

    public String getState() {
        return state;
    }

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

    // 这里状态只有两种,若情况较多则会臃肿难以维护
    public void handle() {
        if ("TurnOn".equals(state)) {
            System.out.println("灯亮了");
        } else if ("TurnOff".equals(state)) {
            System.out.println("灯灭了");
        }
    }
}

2.1 State

代码语言:javascript复制
public interface State {
    void handle(Context context);
}

2.2 TurnOnState

代码语言:javascript复制
public class TurnOnState implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前状态 TurnOn: 灯亮了");
        context.setState(this);
    }
}

2.3 TurnOffState

代码语言:javascript复制
public class TurnOffState implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前状态 TurnOff: 灯灭了");
        context.setState(this);
    }
}

2.4 Context

代码语言:javascript复制
public class Context {
    private State state;

    public State getState() {
        return state;
    }

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

2.5 测试

使用了状态模式会让代码结构复杂起来,但条件逻辑会更加清晰

代码语言:javascript复制
public class Test {
    public static void main(String[] args) {

        Context context = new Context();

        TurnOnState turnOnState = new TurnOnState();
        turnOnState.handle(context);

        TurnOffState turnOffState = new TurnOffState();
        turnOffState.handle(context);
    }
}

// 当前状态 TurnOn: 灯亮了
// 当前状态 TurnOff: 灯灭了

状态模式和策略模式较为相似,区别在于状态模式是依靠状态来改变行为,且有状态转变

0 人点赞