预见猿份
主题
首页面试题在线工具关于我们老苗一对一私教学员评价
实战项目
项目前置基础创新WMS项目Java微服务框架与实战云岚到家项目闪聚支付项目学成在线项目青橙电商项目JVM原理与实战调优分布式事务专题Java高频面试题MySQL从入门到精通Java数据结构与算法老苗一对一私教学员评价blog
blog
  • 云岚到家项目

    • 项目介绍
    • 项目安装配置
    • 安装配置-第三方软件安装说明
    • 安装配置-OSS配置文档
    • 安装配置-高德地图web服务配置文档
    • 第一章如何熟悉新项目
    • 运营服务管理模块需求文档v1.0
    • 第二章运营服务管理模块
    • 第三章用户认证
    • 第四章小程序首页
    • 第五章搜索模块
    • 第五章配置ES索引同步环境
    • 第六章优惠券模块
    • 项目实战说明文档
    • 第七章订单模块
    • 第八章支付模块
    • 第八章微信支付调研
    • 第九章系统优化
    • 第九章EasyExcel入门
    • 第十章秒杀抢购模块
    • 第十一章派单调度
    • 第十二章项目总结&部署
    • 第十三章云岚到家100问







----- 到底线了 -----

×

欢迎来到预见猿份,本站项目均为站长原创,学习中有问题可直接提交给站长老苗解决(微信:mrt_0607)。

苗润土老师,20余年一线项目经验,2014年加入黑马,星辰wms、云岚到家、学成在线项目作者,历任高级讲师、教学主管及课程研究员。 b站老苗

第九章 系统优化(学员专享) ​

学习目标: ​

能说出什么是状态机

能说出如何实现一个订单状态机

能够基于状态机组件实现订单状态机

能够说出项目为什么进行分库分表

能够说出分库分表的四种形式

能够说出分库分表常用的技术方案

能够开发ShardingSphere-JDBC入门程序

能够说出家政项目分库分表的技术方案

能够完成对订单数据库进行分库分表

能够说出订单查询的优化方案

能够优化用户端订单列表

能够对运营端订单列表进行优化

能够说出订单快照的实现方案

能够使用订单快照优化订单详情接口

能够说出项目的冷热分离方案

能够对订单数据进行冷热分离

能够对订单订单按年分表

实战:

  1. 取消订单使用状态机
  2. 运营端订单列表优化
  3. 历史订单实现按年分表。

1 状态机 ​

1.1 什么是状态机 ​

目标:能说出什么是状态机

1)当前存在的问题 ​

在预约下单模块设计订单状态共有7种,如下图:

画板

目前我们使用了待支付、派单中两种状态,在代码中我们发现存在对订单状态进行硬编码的情况:

Java
public void paySuccess(TradeStatusMsg tradeStatusMsg) {
  ...
  //订单状态为待支付时当支付成功更新为派单中
    if (ObjectUtil.equal(0, orders.getOrdersStatus())) {
       ...
    }

}
1
2
3
4
5
6
7
8

随着开发的深入这种代码会越来越多,比如在实现对订单进行关闭时代码会写成如下的形式:

Java
if(订单状态==已完成){
  //运营人员在订单完成时取消订单
  //执行此场景下的业务逻辑
  //更新订单状态为派单中
  update(id,已关闭)
)
if(订单状态==服务中){
  //运营人员在服务中时取消订单
  //执行此场景下的业务逻辑
  //更新订单状态为已关闭
  update(id,已关闭)
)
...
1
2
3
4
5
6
7
8
9
10
11
12
13

以上代码存在问题如下:

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

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

2) 使用状态机解决问题 ​

针对以上问题如何解决呢?

我们可以使用状态机对订单状态进行统一管理。

什么是状态机?

上图在UML中叫状态图(又叫状态机图),UML是软件开发中的一种建模语言,用来辅助进行软件设计,常用的如:类图、对象、状态图、序列图等,注意状态机图并不是状态机,状态机是一种数学模型,应用在自动化控制、计算机科学、通信等很多领域,简单理解状态机就是对状态进行统一管理的数学模型。

我们画的状态图是状态机在计算机科学中的应用方法,还有状态机设计模式也是状态机在软件领域的应用方法。

状态机设计模式是状态机在软件中的应用,状态机设计模式描述了一个对象在内部状态发生变化时如何改变其行为,将状态之间的变更定义为事件,将事件暴露出去,通过执行状态变更事件去更改状态,这是状态机设计模式的核心内容。

理解状态机设计模式需要理解四个要素:现态、事件、动作、次态。

(参考地址:https://baike.baidu.com/item/状态机/6548513?fr=ge_ala )

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

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

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

4、动作:发生事件执行的动作,动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

我们拿待支付状态到派单中状态举例:

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

次态:派单中。

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

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

使用状态机优化代码:

使用状态机之后对代码进行以下优化。

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

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

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

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

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

3)小结 ​

什么是状态机,它解决了什么问题?

🔒会员方可继续阅读

试读到此结束,完整实战与源码需开通会员或购买项目,请花两分钟了解下我们

微信二维码微信扫码添加

添加微信:mrt_0607(备注:预见猿份)

与服务人员沟通确认后开通会员或购买项目,即可获取本章完整内容、配套源码与资料。

← 第八章微信支付调研第九章EasyExcel入门 →








如果发现文档内容有错误或排版错乱,请及时联系站长老苗修改,不胜感激。联系方式
关于我们 | 隐私政策 | 豫ICP备2026003386号-4 | 豫公网安备41010202004008号
目录

本页无章节