掌握设计模式--状态模式

news/2025/4/2 18:50:29/文章来源:https://www.cnblogs.com/dennyLee2025/p/18793902

状态模式(State Pattern)

状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,看起来像是改变了其类。这种模式通常用于解决对象在运行时状态多变且行为复杂的问题。

核心思想:将状态与行为绑定,每种状态对应一个具体类有独立的行为逻辑,状态的切换只需更换状态对象,并且状态流转在行为逻辑中完成。

主要组成部分

  1. Context(上下文): 持有当前状态的对象,负责将请求委托给当前状态对象处理。

  2. State(抽象状态): 定义一个接口,封装具体状态对象的行为。

  3. ConcreteState(具体状态): 实现具体状态对应的行为,每个状态对应对象的一个行为。

案例实现

假设我们开发了一个简单的文档审批工作流系统,包括以下状态:

  1. 草稿(Draft): 文档创建后初始状态,可编辑。
  2. 提交(Submitted): 文档已提交,等待审批。
  3. 审批通过(Approved): 文档被批准,不可再修改。
  4. 驳回(Rejected): 文档被驳回,可重新编辑并提交。

案例类图

image

状态接口

public interface State {void handle(Context context);
}

具体状态

一种状态对应一个具体类,实现不同的行为逻辑,在行为中流转到下一种状态。

// 草稿状态
public class DraftState implements State {@Overridepublic void handle(Context context) {System.out.println("当前状态: 草稿状态 >>> 提交文档...");context.setState(new SubmittedState());}
}
// 提交状态
public class SubmittedState implements State {@Overridepublic void handle(Context context) {System.out.println("当前状态: 提交状态 >>> 审批通过 or 审批驳回...");// 模拟审批结果if (Math.random() > 0.5) {System.out.println("文档审批通过");context.setState(new ApprovedState());} else {System.out.println("文档审批驳回");context.setState(new RejectedState());}}
}
// 审批通过状态
public class ApprovedState implements State {@Overridepublic void handle(Context context) {System.out.println("当前状态: 审批通过 >>> 没有其他操作。");}
}
// 驳回状态
public class RejectedState implements State {@Overridepublic void handle(Context context) {System.out.println("当前状态: 驳回状态 >>> 重新编辑并提交文档...");context.setState(new DraftState());}
}

上下文类

状态的流程由上下文类来完成

public class Context {private State state;public Context(State state) {this.state = state;}public void setState(State state) {this.state = state;}public void request() {state.handle(this);}
}

测试代码

public class WorkflowStateDemo {public static void main(String[] args) {Context context = new Context(new DraftState());// 模拟多次状态变化for (int i = 0; i < 5; i++) {context.request();}}
}

运行结果

每次运行的结果可能不同,因为模拟了随机审批结果:

当前状态: 草稿状态 >>> 提交文档...
当前状态: 提交状态 >>> 审批通过 or 审批驳回...
文档审批驳回
当前状态: 驳回状态 >>> 重新编辑并提交文档...
当前状态: 草稿状态 >>> 提交文档...
当前状态: 提交状态 >>> 审批通过 or 审批驳回...
文档审批通过

当前状态: 草稿状态 >>> 提交文档...
当前状态: 提交状态 >>> 审批通过 or 审批驳回...
文档审批通过
当前状态: 审批通过 >>> 没有其他操作。
当前状态: 审批通过 >>> 没有其他操作。
当前状态: 审批通过 >>> 没有其他操作。

扩展状态:可以扩展为更多状态,例如“待修改”、“归档”等,只需要增加具体状态类及状态流转的调整即可。

优缺点和适用场景

优点

  1. 状态切换清晰: 每个状态封装了特定行为,便于管理。
  2. 代码维护性好: 避免了大量的 if-else 或 switch 语句。
  3. 遵循开闭原则: 添加新状态时无需修改现有代码。

缺点

  1. 状态类增多: 每个状态需要一个具体类,可能导致类的数量增加。
  2. 状态切换复杂: 需要在状态中显式定义状态转换逻辑。

适用场景

  • 对象的行为取决于状态,且需要在运行时根据状态改变行为。
  • 替代 if-else 或 switch 语句处理状态逻辑,避免代码复杂性和维护困难。
  • 状态之间的切换清晰明确、状态转换简单且固定。

总结

状态模式有点像策略模式,最大的不同是,状态类维护着状态的流转

状态模式是一种通过将对象的行为与其状态分离,使对象在不同状态下表现出不同行为的设计模式。在状态中需要显式定义状态转换逻辑,状态模式的显式状态转换逻辑适用于状态数量有限、关系明确、行为独立的场景,但在状态复杂、依赖上下文或需要动态控制的情况下,应该引入更灵活的设计方式(如状态机或规则引擎)来简化管理。

可以结合具体业务需求,权衡模式的适用性和实现复杂度,选择最合适的方案。

image

需要查看往期设计模式文章的,可以在个人主页中或者文章开头的集合中查看,可关注我,持续更新中。。。


超实用的SpringAOP实战之日志记录

2023年下半年软考考试重磅消息

通过软考后却领取不到实体证书?

计算机算法设计与分析(第5版)

Java全栈学习路线、学习资源和面试题一条龙

软考证书=职称证书?

软考中级--软件设计师毫无保留的备考分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/909370.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 主从复制:数据库的克隆军团

MySQL 主从复制:数据库的"克隆军团" 👯‍♂️ 如果说数据库世界也有科幻电影,那么 MySQL 的主从复制绝对堪比《星球大战》中的克隆人军队,一个原版,无数复制品,却保持着惊人的同步... 什么是主从复制?🤔 MySQL 主从复制是一种数据库技术,允许将一台 MySQL…

必看!Spring Boot 项目新老版本 Controller 低侵入式切换实战秘籍

在当今快速迭代的软件开发环境中,项目的迁移重构是许多开发团队都绕不开的工作。最近,业务方的一个项目就面临着这样的挑战,而在迁移重构的过程中,如何确保下游系统对接无感知成为了重中之重。具体来说,他们需要实现这样一个需求:读请求访问老版本 Controller 时,能够无…

第6章 异步原理

第6章 异步原理 6.1 生成代码的结构 异步模式的实现原理是基于 状态机 的,它负责追踪 async 方法当前的执行进度。从逻辑上讲,可以分为以下 4 种状态:未启动 正在执行 暂停 完成(成功或 faulted)Eureka 这里的“暂停”,指程序运行至 await 处,任务未完成时,当前方法在此…

用Arduino开发STM32

参考文档: https://blog.csdn.net/weixin_42880082/article/details/121619101 qq:505645074

【重点】文件摆渡系统如何简化跨平台跨网络的文件传输?

在当今数字化时代,企业数据的流动性和安全性变得愈发重要。随着业务规模的扩大和全球化协作的深入,跨平台、跨网络的文件传输需求日益增长。然而,传统的文件传输方式往往面临效率低下、安全性不足、兼容性差等问题。文件摆渡系统作为一种专门设计用于简化跨平台、跨网络文件…

想让你多爱自己一些的开源计时器

我用过 Pomotroid、Reminders MenuBar、Timer 等众多优秀、开源的番茄时钟和计时工具,它们帮我更高效地管理时间,让我更专注地投入工作。 但有一个问题始终困扰着我:每当计时结束时,我总是习惯性地忽略休息提醒,继续沉浸在手头的事情中,直到第二天身体不适才追悔莫及。 最…

VMware ESXi 8.0U3d macOS Unlocker OEM BIOS 标准版和厂商定制版,已适配主流品牌服务器

VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 标准版和厂商定制版,已适配主流品牌服务器VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 标准版和厂商定制版 ESXi 8.0U3d 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日…

AMS1117-LDO(线性稳压器)稳压电路

AMS1117-LDO(线性稳压器)稳压电路 原理图引脚说明编号 名称 功能描述1 GND GND2 VOUT 输出3 VIN 输入4 VOUT 输出拓展C8和C7为输出滤波电容,用于抑制自激振荡。如果这两个电容不接,线性稳压器的输出通常会是一个振荡波形。 电容C5和C6是输入电容。对于交流电压整流输入,它…

Avalonia 界面效果 滚动的渐变矩形边框

本文将和大家介绍一个 Avalonia 界面效果,制作一个滚动的渐变矩形边框本文代码基于 Avalonia 11.2.x 版本实现,预期在其他 Avalonia 版本也能正常使用 本文效果由 晓嗔戈 提供,我只是记录此实现方法的工具人 界面效果如下图所示,录制的gif中颜色存在一些偏差,动画有些卡顿…

Avalonia 界面效果 三个圆实现模糊界面动效背景

本文将和大家介绍一个 Avalonia 动效界面效果,由三个圆带模糊效果实现的模糊界面动效背景,适合用在各种 AIGC 主题的应用里面本文代码基于 Avalonia 11.2.x 版本实现,预期在其他 Avalonia 版本也能正常使用 本文效果由 晓嗔戈 提供,我只是记录此实现方法的工具人 界面效果如…

儿子的画

昨天儿子在幼儿园学习了自制小册子,并在上面画画。 晚上睡觉前,心血来潮想要再展示一下他在学校是怎么弄的,于是又一顿操作起来,动作还算麻利,只是完成之后都已过十点了,非要我们帮他配上文字,我一开始不明就理,以为写个标题就好了..., 但最后终于搞懂他是要我帮忙下一…

团队协作管理:贝尔宾团队角色模型学习

“没有完美的个人,只有完美的团队。” 任何企业的领导者要想使自己的企业能够快速地发展和成长,就必须对团队建设的重要性有正确的认识。团队角色理论 团队角色理论是管理学中用于分析和优化团队协作的重要理论,可以帮助管理者认识人才、选拔人才,组建高效率合作团队。也可…