状态模式(state)
当遇到需要频繁修改状态时,考虑状态模式
场景
-
电梯的运行
- 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态
-
红绿灯
- 红灯、黄灯、绿灯
-
企业或政府系统
-
公文的审批状态
- 报销单据审批状态
- 假条审批
-
-
网上购物时,订单的状态
- 下单
- 已付款
- 已发货
- 送货中
- 已收货
-
酒店系统中,房间的状态变化
-
- 已预订
- 已入住
- 空闲
核心
- 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
结构
-
Context环境类
- 环境类中维护一个State对象,他是定义了当前的状态
-
State抽象状态类
-
ConcreteState具体状态类
- 每一个类封装了一个状态对应的行为
开发中常见的场景
- 银行系统中账号状态的管理
- OA系统中公文状态的管理
- 酒店系统中,房间状态的管理
- 线程对象各状态之间的切换
代码
案例:酒店住房管理
- 状态接口(规范每个状态应做的事情)
- 具体状态实现类(空闲、已预定、入住)
- Context上下文类,保存唯一的状态(房间状态)
状态接口
package state;
public interface State {
void handle();
}
具体状态实现类
空闲状态
package state;
public class FreeState implements State{
@Override
public void handle() {
System.out.println("房间空闲,没人住");
}
}
已预订状态
package state;
public class BookedState implements State{
@Override
public void handle() {
System.out.println("已预定");
}
}
入住状态
package state;
public class CheckedInState implements State{
@Override
public void handle() {
System.out.println("房间已入住");
}
}
上下文类(保存当前唯一状态)
package state;
public class HomeContext {
private State state;
public void setState(State s) {
System.out.println("修改状态!");
state = s;
state.handle();
}
}
测试
package state;
public class Client {
public static void main(String[] args) {
HomeContext ctx = new HomeContext();
ctx.setState(new FreeState());
ctx.setState(new BookedState());
}
}
//结果——————————————————————————————————
修改状态!
房间空闲,没人住
修改状态!
已预定