State Pattern 是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。
核心概念
状态模式的核心思想是将对象的状态封装成独立的类,并将行为委托给当前状态对象。
主要角色
-
Context(上下文):维护一个具体状态的实例,定义客户感兴趣的接口
-
State(状态接口):定义一个接口以封装与Context的特定状态相关的行为
-
ConcreteState(具体状态):实现状态接口,每个子类实现一个与Context状态相关的行为
定义一个状态接口
// 状态接口
public interface State {
void handle(Context context);
}
接着定义三个实现状态接口的类
// 具体状态 - 空闲状态
public class IdleState implements State {
@Override
public void handle(Context context) {
System.out.println("当前是空闲状态,可以开始工作");
context.setState(new WorkingState());
}
}
// 具体状态 - 休息状态
public class RestingState implements State {
@Override
public void handle(Context context) {
System.out.println("当前是休息状态,可以回到空闲状态了");
context.setState(new IdleState());
}
}
// 具体状态 - 工作状态
public class WorkingState implements State {
@Override
public void handle(Context context) {
System.out.println("当前是工作状态,可以休息了");
context.setState(new RestingState());
}
}
最后定义一个上下文信息的类
// 上下文类
public class Context {
private State state;
public Context() {
// 初始状态设为空闲状态
this.state = new IdleState();
}
public void setState(State state) {
this.state = state;
}
public void request() {
// 委托给当前状态处理
state.handle(this);
}
}
编写test类
package com.zsy.State;
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
// 状态变化演示
context.request(); // 空闲 -> 工作
context.request(); // 工作 -> 休息
context.request(); // 休息 -> 空闲
context.request(); // 空闲 -> 工作
}
}
输出
适用场景
-
对象的行为取决于它的状态,并且必须在运行时根据状态改变其行为
-
操作中包含大量与对象状态有关的条件语句
-
当状态转换逻辑复杂时,或者状态数量较多时
状态模式与策略模式的区别
特性 | 状态模式 | 策略模式 |
---|---|---|
目的 | 处理对象内部状态变化 | 封装可互换的算法族 |
状态知晓 | 状态知道其他状态的存在 | 策略通常不知道其他策略 |
转换控制 | 可由状态类或上下文类控制 | 通常由客户端控制 |
状态数量 | 状态数量通常较多 | 策略数量通常较少 |
实际应用案例
-
工作流引擎中的状态管理
-
游戏开发中角色状态管理
-
订单处理系统中的订单状态管理
-
网络协议实现中的连接状态管理