接口+抽象类+默认实现:我是这样搞定多租户对接的
进销存系统对接多省份监管平台,我是这样设计的
一、背景
我们项目是个单体项目,Vue+SpringBoot,做进销存业务。前后端分离,多个客户共用一套代码,每个客户一个前端配置文件、一个后端配置文件,项目部署到每家客户的服务器上。
最近遇到一个新需求:各个省份的监管平台要求客户把进销存数据上传上去。
需要上传的数据包括:
- 入库数据
- 购退数据
- 销售数据
- 销售退货数据
- 库存变更数据
二、需求分析
经过调研,发现几个特点:

1. 接口规范大同小异
对比了各个省份的监管平台接口文档,都是在国家版本的基础上稍作改动,95%的参数都一样。
2. 需要对接的接口
一共6个:
- 签到接口
- 上传入库数据接口
- 上传购退数据接口
- 上传销售数据接口
- 上传销售退货数据接口
- 上传库存变更数据接口
3. 客户需求不统一
- 有的客户不需要上传
- 有的客户只要求上传入库+购退
- 有的客户要求上传销售+销售退货
- 有的医院要求上传销售+销售退货+库存变更
4. 数据处理方式不同
- 大部分客户不需要特别处理,从数据库取数据组装成JSON即可
- 少数客户的数据需要特殊处理
5. 未来可能扩展
监管平台未来可能要求上传其他数据、对接新接口。
三、设计方案
基于以上分析,我设计了如下架构:
1. 接口类
定义5个接口方法:
- 上传入库数据
- 上传购退数据
- 上传销售数据
- 上传销售退货数据
- 上传库存变更数据
2. 抽象类
实现接口类,所有方法默认实现为:“暂无开通此功能”
为什么要用抽象类?
为了应对将来增加接口。如果不用抽象类,接口类增加一个方法,所有实现类都要跟着改。用了抽象类,只需要抽象类增加默认实现,其他类不受影响。
3. 默认空实现类
继承抽象类。不需要上传的客户,都走这个类——什么也不做,直接返回成功。
4. 客户实现类
每家客户写一个实现类,继承抽象类。需要上传哪种数据,就重写哪个方法,写具体的实现逻辑。
5. 省份Client类
每个省份写一个接口对接Client类,供各家客户的实现类调用。这样省份相关的对接逻辑集中管理,复用性强。
6. 公共工具类
考虑到大部分客户都不需要特殊处理,抽出一个公共工具类。不需要特殊处理的客户,直接调用公共工具类的方法;只有需要特殊处理的客户,才重写具体方法。
四、设计图
设计图
#Java #架构设计 #设计模式 #多租户
文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有