核心
- 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
结构
- 环境类(Context):
- 环境类中维护一个State对象,它定义了当前的状态,并委托当前状态处理一些请求;
- 抽象状态类(State):
- 用于封装对象的一个特定状态所对应的行为;
- 具体状态类(ConcreteState):
- 实现了抽象状态类,每个具体状态封装了各自状态对应的行为;
场景
- 电梯的运行
- 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态
- 红绿灯
- 红灯、黄灯、绿灯
- 请假审批
- 企业或政府系统
- 公文的审批
- 网购订单状态
- 下单
- 已付款
- 已发货
- 发货中
- 已收货
开发中常见的场景
- 银行系统中账号状态的管理
- OA系统中公文状态的管理
- 酒店系统中,房间状态的管理
- 线程对象各状态之间的切换
举例代码实现
-
场景:酒店系统中房间的状态变化:
- 已预定: 已预订状态可以入住,入住后就变成已入住状态;也可以取消预订,取消预订后就变成空闲状态;
- 已入住: 已入住状态可以退房,退房后变成空闲状态;
- 空闲: 空闲状态可以预订,预订后变成预订状态;也可以入住,入住后变成已入住状态;
-
代码实现
-
抽象状态类(State)
java
/**
* 抽象房间状态 接口
*/
public interface State {
void handle();
}
- 具体状态类(ConcreteState)
java
/**
* 空闲状态
*/
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)
java
/**
* 环境类:
* 房间对象,持有状态的引用
*/
public class HomeContext {
private State state;
/**
* 设置状态。。
* @param state
*/
public void setState(State state){
System.out.println("修改状态。。");
this.state=state;
this.state.handle();
}
}
- 客户端调用
java
public static void main(String[] args) {
HomeContext hc=new HomeContext();
hc.setState(new FreeState());
hc.setState(new BookedState());
hc.setState(new CheckedInState());
}
更多设计模式学习:
设计模式持续更新中...