线性状态和状态模式有什么区别?

一句话核心区别

  • 线性状态 :是一种状态流转规则(单向、顺序、直线走)
  • 状态模式 :是一种设计模式(代码结构、解耦方案、解决复杂状态)

关系:线性状态 可以用 状态模式 来实现,但状态模式 远不止 线性状态。


用生活例子秒懂

🌱 线性状态 = 排队过安检

只能一步一步往前走

  • 排队 → 安检 → 登机
  • 不能回头、不能插队、不能跳步

🏗️ 状态模式 = 智能自动门(有多种行为、多种跳转)

门有多种状态,每种状态行为完全不同,还能任意跳转

  • 开门 → 关门 → 锁定 → 故障
  • 不同状态下,按按钮效果不一样
  • 可以回头、循环、分支、条件判断

正式对比(最清晰版)

维度 线性状态 (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 → C
  • B → A
  • C → B
  • D → A

任意跳转,完全自由。

3. 线性状态是"规则",状态模式是"架构"

  • 线性状态告诉你:状态怎么走
  • 状态模式告诉你:代码怎么写才不乱

什么时候用哪个?

✅ 用线性状态

  • 简单直线流程
  • 订单、任务、审批、步骤表单
  • 不需要回退、不需要分支
  • 代码越简单越好

✅ 用状态模式

  • 复杂业务
  • 状态多、行为多、跳转乱
  • 需要退款、取消、驳回、重试
  • 代码要长期维护、要扩展

终极总结

  1. 线性状态简单的状态流转方式(单向、顺序、一步一步走)。
  2. 状态模式解决复杂状态的设计模式(解耦、灵活、任意跳转)。
  3. 线性状态可以用状态模式写,但状态模式不是线性状态。
  4. 简单业务用线性状态,复杂业务用状态模式。
相关推荐
一水2 天前
TTFT优化:一个方案的5次推倒重来
java·ai·状态模式
yz_aiks3 天前
Requestly规则使用技巧:前端联调、接口Mock与网络请求调试实战
前端·网络·状态模式·requestly
星恒随风3 天前
C++ STL 详解:map 与 multimap 的使用、operator[]
开发语言·c++·笔记·学习·状态模式
Dontla4 天前
q搜索 / q过滤解释(q参数、query参数、q=)
状态模式
冰箱上的笑话6 天前
从 CORS 报错到两套方案选型:一份能直接抄的跨域复盘
状态模式·安全性测试·跨域
凤山老林7 天前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然
前端·人工智能·状态模式
码云数智-大飞8 天前
前后端沟通总吵架,一套高效协作规范分享
状态模式
不吃辣4908 天前
vibe coding | 如何做一个skill?
ai·状态模式
早点睡啊Y9 天前
深入学LangChain官方文档(二十二):Frontend 高级形态——Headless Tools、Time Travel 与 Generative UI
ui·langchain·状态模式
xxwl58510 天前
markdown基础语法
状态模式