一、场景
- 电梯的运行
维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态 - 红绿灯
红灯、黄灯、绿灯 - 企业或政府系统中公文的审批状态
- 报销单据审批状态
- 假条审批
- 网上购物时,订单的状态
- 下单
- 已付款
- 已发货
- 送货中
- 已收货
- 酒店系统中,房间的状态变化
- 已预订
- 已入住
- 空闲
二、核心
用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题结构:
-
Context
环境类:环境类中维护一个State
对象,他是定义了当前的状态 -
State
抽象状态类 -
ConcreteState
具体状态类:每一个封装了一个状态对应的行为
State.java
package cn.itcast.day250.state;
//状态的统一接口
public interface State {
public void handle();
}
FreeState.java
package cn.itcast.day250.state;
//空闲状态子类
public class FreeState implements State {
@Override
public void handle() {
System.out.println("房屋处于空闲状态");
}
}
BookedState.java
package cn.itcast.day250.state;
//已预订状态子类
public class BookedState implements State {
@Override
public void handle() {
System.out.println("房间已预订");
}
}
CheckedInState.java
package cn.itcast.day250.state;
//已入住状态子类
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("房间已入住");
}
}
说明:这里我们给出了一个状态接口,接口中是一个某个状态的行为,同时给出了三种不同的实现,分别代表三种不同的状态及其相关的行为。
Context.java
package cn.itcast.day250.state;
//上下文类:表示当前房间的状态,同时在不同状态之间进行切换
public class Context {
private State state;
public void setState(State s){
System.out.println("修改状态");
state = s;
state.handle();//调用修改后状态的行为
}
}
说明:这是一个上下文类,这个类主要用于保存当前房间的状态,同时完成状态之间的切换。
Client.java
package cn.itcast.day250.state;
public class Client {
public static void main(String[] args) {
Context tx = new Context();
tx.setState(new FreeState());
}
}