最近在看状态机,先逐步从状态模式学起
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: 灯灭了
状态模式和策略模式较为相似,区别在于状态模式是依靠状态来改变行为,且有状态转变