一句话核心区别
- 线性状态 :是一种状态流转规则(单向、顺序、直线走)
- 状态模式 :是一种设计模式(代码结构、解耦方案、解决复杂状态)
关系:线性状态 可以用 状态模式 来实现,但状态模式 远不止 线性状态。
用生活例子秒懂
🌱 线性状态 = 排队过安检
只能一步一步往前走
- 排队 → 安检 → 登机
- 不能回头、不能插队、不能跳步
🏗️ 状态模式 = 智能自动门(有多种行为、多种跳转)
门有多种状态,每种状态行为完全不同,还能任意跳转
- 开门 → 关门 → 锁定 → 故障
- 不同状态下,按按钮效果不一样
- 可以回头、循环、分支、条件判断
正式对比(最清晰版)
| 维度 | 线性状态 (Linear State) | 状态模式 (State Pattern) |
|---|---|---|
| 本质 | 状态流转规则 | 代码设计结构 |
| 复杂度 | 极低(简单流程) | 高(复杂业务) |
| 跳转方式 | 只能下一步,单向线性 | 任意跳转、分支、循环 |
| 行为逻辑 | 所有状态共用一套逻辑 | 每个状态自己管自己的行为 |
| 代码耦合 | 低,但逻辑简单 | 极低,完美解耦 |
| 适用场景 | 订单、任务、审批等直线流程 | 电梯、游戏、订单+退款+取消 |
| 是否可逆 | 不可逆 | 可任意回退、跳转 |
| Java实现 | 枚举 + nextState | 接口 + 多状态实现类 |
代码层面一眼看出区别
1. 线性状态代码(简单)
只用枚举 定义下一步是谁,不能乱跳。
java
enum OrderState {
UNPAID(PENDING_DELIVER), // 下一步固定
PENDING_DELIVER(PENDING_RECEIVE),
PENDING_RECEIVE(COMPLETED);
}
特点:状态只管"下一步是谁",不管行为。
2. 状态模式代码(复杂、解耦)
每个状态自己拥有行为 ,可以任意跳转。
java
// 状态接口
interface OrderState {
void pay(OrderContext ctx); // 支付
void ship(OrderContext ctx); // 发货
}
// 待支付状态
class UnpaidState implements OrderState {
void pay() { ctx.setState(paid); } // 跳到已支付
void ship() { throw 异常; } // 不能发货
}
// 已支付状态
class PaidState implements OrderState {
void pay() { throw 异常; } // 不能重复支付
void ship() { ctx.setState(shipped); } // 跳到发货
}
特点:
- 每个状态自己决定能做什么、跳到哪
- 逻辑完全分离,超级好维护
- 支持任意跳转、回退、循环、条件分支
最关键的 3 个区别(面试必背)
1. 线性状态 = 固定路线
A → B → C → D
不能变,不能回头。
2. 状态模式 = 自由状态图
可以:
A → CB → AC → BD → A
任意跳转,完全自由。
3. 线性状态是"规则",状态模式是"架构"
- 线性状态告诉你:状态怎么走
- 状态模式告诉你:代码怎么写才不乱
什么时候用哪个?
✅ 用线性状态
- 简单直线流程
- 订单、任务、审批、步骤表单
- 不需要回退、不需要分支
- 代码越简单越好
✅ 用状态模式
- 复杂业务
- 状态多、行为多、跳转乱
- 需要退款、取消、驳回、重试
- 代码要长期维护、要扩展
终极总结
- 线性状态 是简单的状态流转方式(单向、顺序、一步一步走)。
- 状态模式 是解决复杂状态的设计模式(解耦、灵活、任意跳转)。
- 线性状态可以用状态模式写,但状态模式不是线性状态。
- 简单业务用线性状态,复杂业务用状态模式。