news 2026/5/9 16:16:38

设计模式——状态模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式——状态模式

状态模式 (State Pattern)

什么是状态模式?

状态模式是一种行为型设计模式,它允许你在对象的内部状态改变时改变它的行为。对象看起来好像改变了它的类。

简单来说:状态模式就是让对象在不同状态下有不同的行为。

生活中的例子

想象一下:

  • 订单状态:待支付、已支付、已发货、已完成
  • 交通灯:红灯、黄灯、绿灯
  • 游戏角色:正常、受伤、死亡

为什么需要状态模式?

传统方式的问题

// 使用if-else处理状态if(state=="待支付"){// 待支付逻辑}elseif(state=="已支付"){// 已支付逻辑}elseif(state=="已发货"){// 已发货逻辑}

问题

  1. 代码臃肿:大量if-else导致代码臃肿
  2. 难以扩展:新增状态需要修改代码
  3. 难以维护:状态逻辑分散在代码各处

状态模式的优势

// 使用状态模式state.handle();

优势

  1. 清晰分离:每个状态的行为清晰分离
  2. 易于扩展:新增状态很容易
  3. 易于维护:状态逻辑集中管理

状态模式的结构

┌─────────────────────┐ │ State │ 状态接口 ├─────────────────────┤ │ + handle(): void │ └──────────┬──────────┘ │ 实现 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────┐ ┌───────────┴───────┐ ┌───┴────────┐ │ ConcreteState1 │ │ ConcreteState2 │ │ ... │ 具体状态 ├─────────────────┤ ├───────────────────┤ ├────────────┤ │ + handle() │ │ + handle() │ │ │ └─────────────────┘ └───────────────────┘ └────────────┘ ┌─────────────────────┐ │ Context │ 上下文 ├─────────────────────┤ │ - state: State │ │ + setState(): void │ │ + request(): void │ └─────────────────────┘

代码示例

1. 定义状态接口

/** * 状态接口 */publicinterfaceState{/** * 处理请求 */voidhandle();}

2. 定义具体状态

/** * 具体状态:待支付状态 */publicclassPendingPaymentStateimplementsState{@Overridepublicvoidhandle(){System.out.println("订单状态:待支付,等待用户支付");}}/** * 具体状态:已支付状态 */publicclassPaidStateimplementsState{@Overridepublicvoidhandle(){System.out.println("订单状态:已支付,等待发货");}}/** * 具体状态:已发货状态 */publicclassShippedStateimplementsState{@Overridepublicvoidhandle(){System.out.println("订单状态:已发货,等待收货");}}/** * 具体状态:已完成状态 */publicclassCompletedStateimplementsState{@Overridepublicvoidhandle(){System.out.println("订单状态:已完成");}}

3. 定义上下文

/** * 上下文:订单 */publicclassOrder{privateStatestate;publicOrder(){this.state=newPendingPaymentState();}publicvoidsetState(Statestate){this.state=state;}publicvoidrequest(){state.handle();}}

4. 使用状态

/** * 状态模式测试类 * 演示如何使用状态模式管理订单状态 */publicclassStateTest{publicstaticvoidmain(String[]args){System.out.println("=== 状态模式测试 ===\n");// 创建订单Orderorder=newOrder();// 测试不同状态System.out.println("--- 待支付状态 ---");order.request();System.out.println("\n--- 已支付状态 ---");order.setState(newPaidState());order.request();System.out.println("\n--- 已发货状态 ---");order.setState(newShippedState());order.request();System.out.println("\n--- 已完成状态 ---");order.setState(newCompletedState());order.request();System.out.println("\n=== 状态模式的优势 ===");System.out.println("1. 清晰分离:每个状态的行为清晰分离");System.out.println("2. 易于扩展:新增状态很容易");System.out.println("3. 易于维护:状态逻辑集中管理");System.out.println("4. 避免条件语句:避免大量if-else");System.out.println("\n=== 实际应用场景 ===");System.out.println("1. 订单系统:订单状态管理");System.out.println("2. 游戏开发:角色状态管理");System.out.println("3. 工作流:工作流状态管理");System.out.println("4. 交通灯:交通灯状态管理");System.out.println("\n=== 与策略模式的区别 ===");System.out.println("状态模式:对象在不同状态下有不同的行为");System.out.println("策略模式:对象在不同策略下有不同的行为");System.out.println("状态模式:状态之间有转换关系");System.out.println("策略模式:策略之间没有转换关系");}}

状态模式的优点

  1. 清晰分离:每个状态的行为清晰分离
  2. 易于扩展:新增状态很容易
  3. 易于维护:状态逻辑集中管理
  4. 避免条件语句:避免大量if-else

状态模式的缺点

  1. 类数量增加:每个状态都需要一个类
  2. 状态转换复杂:状态转换可能比较复杂

适用场景

  1. 多个状态:对象有多个状态
  2. 状态依赖:行为依赖于状态
  3. 状态转换:状态需要频繁转换

常见应用场景

  • 订单系统:订单状态管理
  • 游戏开发:角色状态管理
  • 工作流:工作流状态管理

使用建议

  • 多个状态:使用状态模式
  • 状态依赖:使用状态模式
  • 简单状态:直接使用if-else即可

注意事项

⚠️ 状态模式虽然有用,但要注意:

  • 不要让状态转换过于复杂
  • 考虑使用状态机
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 9:29:10

Speech Seaco Paraformer离线使用:无网络环境部署要点

Speech Seaco Paraformer离线使用:无网络环境部署要点 1. 引言:为什么需要离线语音识别? 在很多实际场景中,我们无法依赖稳定的网络连接——比如企业内网、工业现场、移动设备或对数据隐私要求极高的场合。这时候,一…

作者头像 李华
网站建设 2026/5/3 16:43:13

5个步骤掌握全平台B站视频下载工具:高效解决你的资源保存难题

5个步骤掌握全平台B站视频下载工具:高效解决你的资源保存难题 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bil…

作者头像 李华
网站建设 2026/5/9 15:46:32

Z-Image-Turbo_UI详细教程:启动服务+访问界面+查看输出全流程

Z-Image-Turbo_UI详细教程:启动服务访问界面查看输出全流程 Z-Image-Turbo 图像生成UI Gradio界面 本地部署 AI绘图工具 output_image路径 7860端口 这是一份真正面向新手的实操指南——不讲原理、不堆参数、不绕弯子,从敲下第一行命令开始,…

作者头像 李华
网站建设 2026/5/2 15:36:57

革命性华硕笔记本控制工具G-Helper智能调节方案

革命性华硕笔记本控制工具G-Helper智能调节方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/5/1 4:01:34

Qwen3-4B-Instruct部署教程:从环境配置到网页调用完整指南

Qwen3-4B-Instruct部署教程:从环境配置到网页调用完整指南 1. 为什么选Qwen3-4B-Instruct?它到底能做什么 你可能已经听过“通义千问”,但Qwen3-4B-Instruct-2507不是简单升级,而是一次面向真实使用场景的深度打磨。它不是实验室…

作者头像 李华
网站建设 2026/5/1 12:24:11

OpCore Simplify: 自动化OpenCore EFI配置的开源解决方案

OpCore Simplify: 自动化OpenCore EFI配置的开源解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpenCore是黑苹果社区广泛使用的引导加载程序…

作者头像 李华