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

一句话核心区别

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

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


用生活例子秒懂

🌱 线性状态 = 排队过安检

只能一步一步往前走

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

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

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

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

正式对比(最清晰版)

维度 线性状态 (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. 简单业务用线性状态,复杂业务用状态模式。
相关推荐
边界条件╝14 小时前
微前端进阶(四)
前端·状态模式
我是一颗柠檬20 小时前
【Java后端技术亮点】动态路由权限(按钮级权限),细粒度控制到按钮级别
java·开发语言·后端·状态模式
霸道流氓气质1 天前
Excel 数据导出实战指南
excel·状态模式
布局呆星1 天前
HTML+fastAPI+Dify|打通前后端至智能体的路
状态模式
霸道流氓气质1 天前
批量异步处理 + MQ + Redis 进度追踪实战指南
数据库·redis·状态模式
会编程的土豆1 天前
前端和后端是怎么配合工作的(Go后端视角)
前端·golang·状态模式
前端不太难1 天前
鸿蒙游戏 HUD 如何设计?
游戏·状态模式·harmonyos
俏皮小混子2 天前
山东大学软件学院项目实训-创新实训-计科智伴(五)——个人博客(从接口对接到边界问题修复的完整记录)
笔记·学习·状态模式·山东大学
前端不太难2 天前
从语言生成到世界交互:AGI的具身化演进之路
状态模式·交互·agi