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

一句话核心区别

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

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


用生活例子秒懂

🌱 线性状态 = 排队过安检

只能一步一步往前走

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

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

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

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

正式对比(最清晰版)

维度 线性状态 (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. 简单业务用线性状态,复杂业务用状态模式。
相关推荐
星恒随风7 天前
C++ string 类详解:常用接口、OJ 场景与模拟实现中的深浅拷贝
开发语言·c++·笔记·学习·状态模式
colofullove8 天前
实时游玩页与 WebSocket 状态管理实现
websocket·网络协议·状态模式
夏天测9 天前
业务逻辑漏洞实战:篡改响应包绕过登录,直入后台管理系统
渗透测试·状态模式·业务逻辑漏洞·web 安全·响应包篡改
可乐ea9 天前
【Spring Boot + MyBatis|第7篇】JWT 登录认证与拦截器实现
java·spring boot·后端·mybatis·状态模式
前端不太难10 天前
GPU 集群调度架构解析
架构·状态模式
ShiJiuD66688899910 天前
外卖项目笔记总结上 (后端板块)
状态模式
前端不太难10 天前
当 AI 接管 Workspace:鸿蒙 PC Agent 架构设计实践
人工智能·状态模式·harmonyos
Maimai1080811 天前
Web3 前端实时通信如何落地:从 SSE 订阅到行情、订单与账户状态更新
前端·javascript·react.js·前端框架·web3·状态模式
不吃青椒!11 天前
LangGraph 流式事件处理:从实战到体系
ai·langchain·状态模式
前端不太难12 天前
鸿蒙游戏世界模型:实现原理 + Demo实现
游戏·状态模式·harmonyos