
欢迎来到预见猿份,本站项目均为站长原创,学习中有问题可直接提交给站长老苗解决(微信:mrt_0607)。
苗润土老师,20余年一线项目经验,2014年加入黑马,星辰wms、云岚到家、学成在线项目作者,历任高级讲师、教学主管及课程研究员。 b站老苗
第九章 系统优化(学员专享)
学习目标:
能说出什么是状态机
能说出如何实现一个订单状态机
能够基于状态机组件实现订单状态机
能够说出项目为什么进行分库分表
能够说出分库分表的四种形式
能够说出分库分表常用的技术方案
能够开发ShardingSphere-JDBC入门程序
能够说出家政项目分库分表的技术方案
能够完成对订单数据库进行分库分表
能够说出订单查询的优化方案
能够优化用户端订单列表
能够对运营端订单列表进行优化
能够说出订单快照的实现方案
能够使用订单快照优化订单详情接口
能够说出项目的冷热分离方案
能够对订单数据进行冷热分离
能够对订单订单按年分表
实战:
- 取消订单使用状态机
- 运营端订单列表优化
- 历史订单实现按年分表。
1 状态机
1.1 什么是状态机
目标:能说出什么是状态机
1)当前存在的问题
在预约下单模块设计订单状态共有7种,如下图:

目前我们使用了待支付、派单中两种状态,在代码中我们发现存在对订单状态进行硬编码的情况:
public void paySuccess(TradeStatusMsg tradeStatusMsg) {
...
//订单状态为待支付时当支付成功更新为派单中
if (ObjectUtil.equal(0, orders.getOrdersStatus())) {
...
}
}随着开发的深入这种代码会越来越多,比如在实现对订单进行关闭时代码会写成如下的形式:
if(订单状态==已完成){
//运营人员在订单完成时取消订单
//执行此场景下的业务逻辑
//更新订单状态为派单中
update(id,已关闭)
)
if(订单状态==服务中){
//运营人员在服务中时取消订单
//执行此场景下的业务逻辑
//更新订单状态为已关闭
update(id,已关闭)
)
...以上代码存在问题如下:
在业务代码中对订单状态进行硬编码如果有一天更改了业务逻辑就需要更改代码,不方便进行系统扩展和维护。
另外对订单状态的管理是散落在很多地方不方便对订单状态进行统一管理和维护。
2) 使用状态机解决问题
针对以上问题如何解决呢?
我们可以使用状态机对订单状态进行统一管理。
什么是状态机?
上图在UML中叫状态图(又叫状态机图),UML是软件开发中的一种建模语言,用来辅助进行软件设计,常用的如:类图、对象、状态图、序列图等,注意状态机图并不是状态机,状态机是一种数学模型,应用在自动化控制、计算机科学、通信等很多领域,简单理解状态机就是对状态进行统一管理的数学模型。
我们画的状态图是状态机在计算机科学中的应用方法,还有状态机设计模式也是状态机在软件领域的应用方法。
状态机设计模式是状态机在软件中的应用,状态机设计模式描述了一个对象在内部状态发生变化时如何改变其行为,将状态之间的变更定义为事件,将事件暴露出去,通过执行状态变更事件去更改状态,这是状态机设计模式的核心内容。
理解状态机设计模式需要理解四个要素:现态、事件、动作、次态。
(参考地址:https://baike.baidu.com/item/状态机/6548513?fr=ge_ala )
1、现态:是指当前所处的状态。
2、次态:条件满足后要迁往的新状态。
3、事件:当一个条件被满足,状态会由现态变为新的状态,事件发生会触发一个动作,或者执行一次状态的迁移。
4、动作:发生事件执行的动作,动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
我们拿待支付状态到派单中状态举例:

现态:订单当前处于待支付状态那么现态为待支付。
次态:派单中。
事件:用户支付成功为事件,支付成功是条件,当条件满足进行状态迁移。
动作:将订单状态由待支付更改为派单中。
使用状态机优化代码:
使用状态机之后对代码进行以下优化。
支付成功更改订单状态的代码优化如下:
if(支付状态==支付成功){
//调用状态机执行支付成功事件
orderStateMachine.changeStatus(id,支付成功事件);
}订单取消的代码优化如下:
orderStateMachine.changeStatus(id,订单完成时取消订单事件);我们发现使用状态机的代码并没有对订单状态进行硬编码,只是指定了订单id和事件名称,执行changeStatus方法后自动更改订单的状态。
3)小结
什么是状态机,它解决了什么问题?
试读到此结束,完整实战与源码需开通会员或购买项目,请花两分钟了解下我们
微信扫码添加添加微信:mrt_0607(备注:预见猿份)
与服务人员沟通确认后开通会员或购买项目,即可获取本章完整内容、配套源码与资料。
