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

一句话核心区别

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

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


用生活例子秒懂

🌱 线性状态 = 排队过安检

只能一步一步往前走

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

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

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

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

正式对比(最清晰版)

维度 线性状态 (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. 简单业务用线性状态,复杂业务用状态模式。
相关推荐
前端H4 天前
微前端 v3 架构升级:从加载隔离到状态协同
前端·架构·状态模式
脑子运行超载6 天前
Java动态生成PDF文件
java·pdf·状态模式·文件上传下载
喵叔哟8 天前
Day 2:先做一个能聊天的页面
状态模式
Arranging157888 天前
2026最新5款AI编程工具平替实测合集
状态模式
aaaa954726658 天前
2026最新5款AI编程工具平替实测合集
状态模式
chase_my_dream10 天前
FAST-LIO src/IMU_Processing.hpp 完整详细讲解
c++·状态模式·slam
前端不太难14 天前
Tool Graph:HarmonyOS PC 如何统一所有系统能力?
华为·状态模式·harmonyos
星恒随风1 个月前
C++ string 类详解:常用接口、OJ 场景与模拟实现中的深浅拷贝
开发语言·c++·笔记·学习·状态模式
colofullove1 个月前
实时游玩页与 WebSocket 状态管理实现
websocket·网络协议·状态模式
夏天测1 个月前
业务逻辑漏洞实战:篡改响应包绕过登录,直入后台管理系统
渗透测试·状态模式·业务逻辑漏洞·web 安全·响应包篡改