概念
允许对象在内部状态变化时,改变它的行为,看起来就像是对象本身发生了变化一样
应用场景
有些对象的行为依赖于内部状态的变化,使用状态模式,每个状态维护一个独立的类,使得对象状态切换更加清晰。避免使用大量if-else
基本结构

1)环境类(Context):持有当前状态对象,负责状态的切换,同时对外暴露统一的行为接口。
2)状态接口(State):定义所有具体状态需要实现的接口或者抽象类
3)具体状态类(ConcreteState):实现抽象状态定义的行为,每个具体状态类封装了对应的操作逻辑,并且可以决定是否切换到其他状态
代码实现
以 “订单状态流转管理” 为例
状态接口
声明订单的所有状态操作
要求不同状态的类都要实现对应的处理方法
public interface OrderState {
void handleRequest(Order order); // 处理订单请求,根据不同状态执行不同操作
}
具体状态类
每个状态都作为一个类来实现
每个状态类都实现了 OrderState 接口的 handleRequest() 方法,具体的操作会根据当前状态执行相应的逻辑
public class PendingState implements OrderState {
@Override
public void handleRequest(Order order) {
System.out.println("订单处于待支付状态,请支付。");
order.setState(new PaidState()); // 支付完成后,改变订单状态为已支付
}
}
public class PaidState implements OrderState {
@Override
public void handleRequest(Order order) {
System.out.println("订单已支付,请发货。");
order.setState(new ShippedState()); // 发货后,改变订单状态为已发货
}
}
public class ShippedState implements OrderState {
@Override
public void handleRequest(Order order) {
System.out.println("订单已发货,请等待接收。");
order.setState(new CompletedState()); // 完成后,改变订单状态为已完成
}
}
public class CompletedState implements OrderState {
@Override
public void handleRequest(Order order) {
System.out.println("订单已完成。");
}
}
环境类
管理当前订单状态并切换状态
包含表示“状态”的成员变量,提供改变状态的方法和当前状态下的处理方法
public class Order {
private OrderState state;
public Order() {
this.state = new PendingState(); // 初始状态为“待支付”
}
public void setState(OrderState state) {
this.state = state;
}
public void request() {
state.handleRequest(this); // 调用当前状态的处理方法
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Order order = new Order(); // 创建一个订单
// 客户端操作:订单请求
order.request(); // 初始状态是“待支付”
// 模拟状态流转
order.request(); // 订单支付后,进入“已支付”状态
order.request(); // 订单发货后,进入“已发货”状态
order.request(); // 订单完成后,进入“已完成”状态
}
}
优缺点
优点
1)简化复杂条件语句:省略了不同状态的if-else语句
2)易于扩展:每增加一种状态时,我们只需要创建一个新的状态类
缺点
1)状态之间的转换复杂:如果状态之间的转换规则比较复杂,可能会导致状态类之间的耦合度较高
