一. 问题背景
可以先了解关于电商库存的读取。加载完sku信息后,如果订单号还没有创建(即还没有创建订单)就会校验库存。更新订单时,不需要再判断库存。关于库存更新的业务用了命令设计模式+模板方法设计模式。
二. 前言
技术栈:SpringBoot,Redis
设计模式:工厂模式,命令模式,模板方法。(关于设计模式,详情可参考gmall-learing项目的gmall-design-strategy模块的readme.md文件)
三. 场景介绍
命令模式的场景也很常用,比如你要执行一些操作,这些操作都实现了一个接口,但是有不同的实现,这些命令的执行类是同一个,需要执行什么命令发送这个命令给到执行类就可以了,其实这样看,策略模式和命令模式是有点像的,但是他们其实是有本质去别的。
策略模式是为了解决if/else的问题。而 命令模式除了可以执行正向的命令外,还可以提供回退的命令来回退正向的命令。
项目中的库存更新目前就是使用了命令模式。
库存更新需要更新可用库存,更新锁定库存,更新已销售库存,还要记录日志等。不同的更新逻辑中,上述的实现都不一样,因此可以将每种更新都看做一种命令,只需要客户端发送一个命令过来,就可以指定实现类来进行实现。目前shoplus根据不同的扣减规则做了一些扣减的命令。
实际上电商erp系统中,可以做到更多的库存相关的操作,比如采购入库库存更新、退货入库库存更新、提交订单库存更新、支付订单库存更新、取消订单库存更新等等。
对于每一种命令,我们用对应的工厂方法创建出来。比如用更新可用库存工厂方法创建更新可用库存命令,用记录日志工厂方法创建记录日志命令。
四. 思路
思路如下:
五. 解决方案
详情见gmall-learning项目的gmall-design-command模块,主要了解该模块下的inventory文件夹里面的类即可。