第10章:状态模式(State Pattern)
一、导读
1.1 本章学习目标
第10章讲解状态模式——允许对象在内部状态改变时改变其行为。
1.2 为什么第十章如此重要
状态模式将状态封装为独立的类,消除了大量的条件判断语句。
1.3 核心问题引导
状态模式如何消除条件判断?
状态转换如何管理?
状态模式和策略模式有什么区别?
状态机如何设计?
二、核心概念详解
10.1 状态模式
java
// 状态接口
public interface State {
void insertQuarter();
void ejectQuarter();
void turnCrank();
void dispense();
}
// 具体状态
public class NoQuarterState implements State {
GumballMachine machine;
public NoQuarterState(GumballMachine machine) {
this.machine = machine;
}
public void insertQuarter() {
System.out.println("Quarter inserted");
machine.setState(machine.getHasQuarterState());
}
public void ejectQuarter() {
System.out.println("No quarter to eject");
}
public void turnCrank() {
System.out.println("No quarter inserted");
}
public void dispense() {
System.out.println("No quarter inserted");
}
}
// 上下文
public class GumballMachine {
State noQuarterState;
State hasQuarterState;
State soldState;
State soldOutState;
State state;
int count;
public GumballMachine(int count) {
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
soldState = new SoldState(this);
soldOutState = new SoldOutState(this);
this.count = count;
state = count > 0 ? noQuarterState : soldOutState;
}
public void insertQuarter() { state.insertQuarter(); }
public void ejectQuarter() { state.ejectQuarter(); }
public void turnCrank() { state.turnCrank(); state.dispense(); }
void setState(State state) { this.state = state; }
}10.2 状态 vs 策略
状态模式:
- 封装不同的状态
- 状态之间可以转换
- 客户端不直接控制状态
策略模式:
- 封装不同的算法
- 客户端选择策略
- 策略之间不转换三、实战案例
10.1 订单状态机
java
public enum OrderState {
CREATED {
public OrderState next() { return CONFIRMED; }
},
CONFIRMED {
public OrderState next() { return SHIPPED; }
},
SHIPPED {
public OrderState next() { return DELIVERED; }
},
DELIVERED {
public OrderState next() { return COMPLETED; }
},
COMPLETED {
public OrderState next() { throw new IllegalStateException(); }
};
public abstract OrderState next();
}四、本章小结
状态模式将状态封装为独立的类,消除条件判断。状态之间可以转换。与策略模式的区别在于状态自动转换,策略由客户端选择。
五、思考与练习
状态模式如何消除条件判断?
状态转换如何管理?
状态模式和策略模式有什么区别?
如何实现并发安全的状态机?
状态模式在哪些场景中应用?