1. 定义
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
2. 角色
- Context:环境类
- State:抽象状态类
- ConcreteState:具体状态类
3. 特点
- 优点:将所有与某个状态相关的行为放入一个状态类中,可以方便地增加新的状态类,将状态的转换逻辑与状态对象合为一体,封装了转换逻辑,取代了巨大的条件判断块。
- 缺点:该模式的使用会增加系统类和对象的个数,当新增状态类时,需要对原状态类的转换逻辑进行修改,违背了开闭原则。
4. 示例
State:
public interface State {
public void handle(Context context);
}
具体状态类:
// ConcreteStateA
public class ConcreteStateA implements State {
@Override
public void handle(Context context) {
System.out.println("change to state B");
context.changeState(new ConcreteStateB());
}
}
// ConcreteStateB
public class ConcreteStateB implements State {
@Override
public void handle(Context context) {
System.out.println("change to state A");
context.changeState(new ConcreteStateA());
}
}
Context:
public class Context {
State state;
public Context() {
state = new ConcreteStateA();
}
public void changeState(State state) {
this.state = state;
}
public void request() {
state.handle(this);
}
}
测试类:
public class TestState {
public static void main(String[] args) {
Context context = new Context();
context.request();
context.request();
}
}
// 输出
// change to state B
// change to state A
参考:
1. 《Head First 设计模式》
2. 《图说设计模式》https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/state.html