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

一句话核心区别

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

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


用生活例子秒懂

🌱 线性状态 = 排队过安检

只能一步一步往前走

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

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

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

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

正式对比(最清晰版)

维度 线性状态 (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. 简单业务用线性状态,复杂业务用状态模式。
相关推荐
国科安芯1 天前
ASL622S:把“信号失真“挡在门外的航天级运放
网络·单片机·嵌入式硬件·架构·状态模式·低轨卫星星座
leoZ2315 天前
Vue3 还原一个企业级后台-08-API注册管理
目标检测·机器学习·分类·状态模式·迁移学习·集成学习·figma
Java&Develop6 天前
QuantDinger 宝塔 Linux 部署完整指南
linux·运维·状态模式
星恒随风6 天前
C++ 红黑树封装(二):迭代器、const_iterator 与 operator[] 完整实现 mymap 和 myset
开发语言·c++·状态模式
sugar__salt6 天前
在浏览器里跑 DeepSeek-R1:用 WebGPU 把大模型搬进前端
前端·javascript·状态模式
火云牌神6 天前
异常与统一封装架构:规范统一返回值、全局异常与参数校验
架构·状态模式·ai编程·vibecoding
云和数据.ChenGuang8 天前
fastapi的参数剖析
人工智能·深度学习·机器学习·语言模型·状态模式·fastapi
罗小爬EX9 天前
AI Chat 多类型流式事件处理方案(以AgentScope Java 2为例)
java·人工智能·状态模式
xier_ran10 天前
【infra之路】AI 编译器(二):后端优化
人工智能·状态模式·infra