场景
- 电梯的运行
- 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态。
- 红绿灯
- 红灯、黄灯、绿灯
- 网上购物时,订单的状态
- 下单
- 已付款
- 已发货
- 送货中
- 已收货
核心:用于解决系统中复杂对象状态转换以及不同状态下行为的封装问题。
结构:
Context环境类
- 环境类中维护一个State对象,他是定义来了当前的状态。
State抽象状态类
ConcreteState具体状态类
- 每一个类封装了一个状态对应的行为。
举例:我们都知道宾馆有三种情况,空闲,已预订,已入住。
- 定义房间的状态接口
public interface State {
void handle();
}
- 空闲状态
public class FreeState implements State {
@Override
public void handle() {
System.out.println("房间空闲!!!没人住");
}
}
- 已预订状态
public class BookedState implements State {
@Override
public void handle() {
System.out.println("房间已预订!别人不能定!");
}
}
- 房间已入住
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("房间已入住!请勿打扰!");
}
}
- Context环境变量
public class HomeContext {
State state;
public void setState(State state) {
System.out.println("修改房间状态");
this.state = state;
state.handle();
}
}
测试
HomeContext context = new HomeContext();
context.setState(new FreeState());
context.setState(new BookedState());
context.setState(new CheckedInState());