状态机设计模式

news2024/9/24 9:59:01

1. 订单管理中存在的问题

订单管理中,订单存在未支付,派单中,服务中,已完成等等状态,所以在业务代码中,都是首先判断订单的状态,然后根据不同状态执行不同的逻辑。

在业务代码中对订单状态进行硬编码,如果有一天更改了业务逻辑就需要更改代码,不方便进行系统扩展和维护。

另外对订单状态的管理,散落在很多地方不方便对订单状态进行统一管理和维护。

2. 为什么使用状态机

在实际业务场景中,特别是对于复杂状态的管理(如订单状态、支付状态等),传统方式通常是直接在代码中硬编码状态转换逻辑,例如使用 if-elseswitch-case 判断状态。然而这种方式有几个缺点:

  • 扩展性差:如果要新增或修改状态转换逻辑,需要在多处修改代码,容易引入问题。
  • 维护性差:随着业务逻辑变得复杂,状态管理分散在各个地方,难以统一管理。
  • 代码可读性差:状态与事件之间的关联性不强,导致代码结构混乱。

状态机通过将状态转换逻辑集中管理,提供了统一的管理方式,避免了硬编码问题,提升了系统的扩展性和可维护性。

3. 什么是状态机设计模式

状态机设计模式是一种编程模式,用于解决某个对象在不同状态之间的转换问题。通过使用状态机,程序可以更加直观地管理对象的状态变化,并且避免了在业务代码中硬编码状态逻辑。其核心思想是:对象有多个状态,状态可以通过某些事件发生变化,每次状态变化时可能会触发一些动作。

状态机设计模式解决了在复杂业务中,尤其是像订单管理等系统,状态间的相互切换以及行为变化难以维护的问题。通过抽象化状态与事件的关系,使代码更加可维护、可扩展。

4. 状态机的核心要素

状态机设计模式包含四个核心要素:

  • 现态(Current State):对象当前的状态。
  • 事件(Event):触发状态变化的事件。
  • 动作(Action):当事件发生时,执行的操作。
  • 次态(Next State):当事件触发后,对象转换到的新状态。

通过这四个元素,可以构建出一个对象从一种状态到另一种状态的转换流程。

5. 使用状态机优化代码

以待支付状态到派单中状态举例:

现态:订单当前处于待支付状态那么现态为待支付。

事件:用户支付成功为事件,支付成功是条件,当条件满足进行状态迁移。

动作:将订单状态由待支付更改为派单中。

次态:派单中。

使用状态机优化代码:

(1)支付成功更改订单状态的代码优化如下:

if(支付状态==支付成功){
    //调用状态机执行支付成功事件
    orderStateMachine.changeStatus(id,支付成功事件);
}

(2)订单取消的代码优化如下:

orderStateMachine.changeStatus(id,订单完成时取消订单事件);

使用状态机的代码并没有对订单状态进行硬编码,只是指定了订单id和事件名称,执行changeStatus方法后自动更改订单的状态。

6. 总结

状态机就是对状态进行统一管理的数学模型,应用在软件领域是状态机设计模式,有了状态机就可以避免在业务代码中对状态进行硬编码,增加系统的可扩展性。状态机设计模式包括四个要素:现态、事件、动作、次态。

1、现态:是指当前所处的状态。

2、事件:当一个条件被满足,状态会由现态变为新的状态,事件发生可能会触发一个动作,或者执行一次状态的迁移。

3、动作:发生事件执行的动作,动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的。

4、次态:条件满足后要迁往的新状态。

通过状态机更改状态只需要指定事件名称即可,避免了状态字段在代码中硬编码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Unity Demo]从零开始制作空洞骑士Hollow Knight第九集:制作小骑士基本的攻击行为Attack以及为敌人制作生命系统和受伤系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作小骑士基本的攻击行为Attack 1.制作动画以及使用UNITY编辑器编辑2.使用代码实现扩展新的落地行为和重落地行为3.使用状态机实现击中敌人造成伤害机制二…

移动端列表筛选封装

适合场景&#xff1a;Vue2vant 移动端项目&#xff0c;数据填充添加全部选项及相关逻辑处理&#xff0c;支持多选、单选以及筛选状态返回 效果图 选中交互 使用说明 <filter-box ref"filterBox" :isMultiple"true" //是否多选:params"waitData&q…

ant design vue实现表格序号递增展示~

1、代码实例 //current当前页数 //pageSize每页记录数 const columns [{title: 序号,width: 100,customRender: ({ index }) > ${index (current.value - 1) * pageSize.value 1},align: center,fixed: left,} ] 2、效果图

虚拟机:4、配置12.5的cuda和gromacs

前言&#xff1a;本机环境是win11&#xff0c;通过wsl2安装了ubuntu实例并已实现gpu直通&#xff0c;现在需要下载12.5的cuda 一、查看是否有gpu和合适的cuda版本 在ubuntu实例中输入 nvidia-smi输出如下&#xff1a; 说明该实例上存在gpu驱动&#xff0c;且适合的CUDA版本…

解决银河麒麟操作系统在单用户模式下根分区只读的问题

解决银河麒麟操作系统在单用户模式下根分区只读的问题 1、问题描述2、问题解决方法 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟操作系统时&#xff0c;有时我们可能需要进入单用户模式来进行系统维护或修复。然而&#x…

软考高级:中台相关知识 AI 解读

中台&#xff08;Middle Platform&#xff09;是近年来在软件开发和企业架构中兴起的一种理念和架构模式&#xff0c;尤其在中国的互联网企业中得到了广泛应用。中台的核心思想是通过构建一个共享的服务和能力平台&#xff0c;支持前端业务的快速迭代和创新&#xff0c;从而提升…

企业职工薪资查询系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;员工管理&#xff0c;部门管理&#xff0c;工资信息管理&#xff0c;工资安排管理&#xff0c;考勤信息管理&#xff0c;交流论坛&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…

2024年最新 信息安全 标准 汇总

背景 信息安全标准是安全专家智慧的结晶&#xff0c;是安全最佳实践的概括总结&#xff0c;是非常好的入门/参考手册&#xff0c;是信息安全建设的理论基础和行动指南。 本页对TC260发布的所有信息安全标准&#xff0c;进行了分类汇总&#xff0c;并提供在线预览和批量下载&am…

【深度学习】03-神经网络01-4 神经网络的pytorch搭建和参数计算

# 计算模型参数,查看模型结构,我们要查看有多少参数&#xff0c;需要先安装包 pip install torchsummary import torch import torch.nn as nn from torchsummary import summary # 导入 summary 函数&#xff0c;用于计算模型参数和查看模型结构# 创建神经网络模型类 class Mo…

【ComfyUI】控制光照节点——ComfyUI-IC-Light-Native

原始代码&#xff08;非comfyui&#xff09;&#xff1a;https://github.com/lllyasviel/IC-Light comfyui实现1&#xff08;600星&#xff09;&#xff1a;https://github.com/kijai/ComfyUI-IC-Light comfyui实现2&#xff08;500星&#xff09;&#xff1a;https://github.c…

【QT】QSS基础

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;基本语法&#x1f449;&#x1f3fb;从⽂件加载样式表&#x1f449;&#x1f3fb;选择器伪类选择器 &#x1f449;&…

动手学深度学习9.1. 门控循环单元(GRU)-笔记练习(PyTorch)

本节课程地址&#xff1a;门控循环单元&#xff08;GRU&#xff09;_哔哩哔哩_bilibili 本节教材地址&#xff1a;9.1. 门控循环单元&#xff08;GRU&#xff09; — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chap…

K8S服务发布

一 、服务发布方式对比 二者主要区别在于&#xff1a; 1. 部署复杂性&#xff1a;传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等&#xff0c;过程相对复 杂且容易出错。相比之下&#xff0c;Kubernetes服务发布方式 通过使用容器编排和自动化部署工…

高灵敏度电容式触摸IC在弹簧触控按键中的应用

电容式触摸IC-弹簧触控按键-是通过检测人体与传感器之间的电容变化来实现触摸控制。这种技术具有高灵敏度、稳定性好、防水性强等优点&#xff0c;广泛应用于家用电器、消费电子、工业控制等领域。 弹簧触控按键的特点&#xff1a; 1. 高灵敏度&#xff1a;即使隔着绝缘材料&a…

Java语言的Springboot框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码

介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 有需者咨询&#xff0c;非诚勿扰&#xff1b; 软件架构 1、提供云快充底层桩直连协议&#xff0c;版本为云快充1.5&#xff0c;对于没有对接过充电桩系统的开发者…

[vulnhub] Jarbas-Jenkins

靶机链接 https://www.vulnhub.com/entry/jarbas-1,232/ 主机发现端口扫描 扫描网段存活主机&#xff0c;因为主机是我最后添加的&#xff0c;所以靶机地址是135的 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-21 14:03 CST Nmap scan…

求职Leetcode题目(11)

1.最长连续序列 解题思路: 方法一&#xff1a; • 首先对数组进行排序&#xff0c;这样我们可以直接比较相邻的元素是否连续。• 使用一个变量 cur_cnt 来记录当前的连续序列长度。• 遍历排序后的数组&#xff1a; 如果当前元素与前一个元素相等&#xff0c;则跳过&#xf…

文档矫正算法:DocTr++

文档弯曲矫正&#xff08;Document Image Rectification&#xff09;的主要作用是在图像处理领域中&#xff0c;对由于拍摄、扫描或打印过程中产生的弯曲、扭曲文档进行校正&#xff0c;使其恢复为平整、易读的形态。 一. 论文和代码 论文地址&#xff1a;https://arxiv.org/…

AI辅助编码工具如何影响着程序员开发群体

AI辅助编码工具的出现对程序员开发群体产生了深远的影响&#xff0c;有一些初步基础的程序员&#xff0c;可以借助AI工具的加持&#xff0c;生产效率大大提升&#xff0c;达到中高级程序员的水平。 这些影响可以从多个角度来分析&#xff1a; 提高开发效率&#xff1a; AI工具…

跳蚤市场小程序|基于微信小程序的跳蚤市场(源码+数据库+文档)

跳蚤市场小程序目录 基于微信小程序的饮品点单系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 管理员功能实现 商品信息管理 商品订单管理 论坛管理 用户管理 5.1.5 新闻信息管理 用户功能实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&a…