订单接收不同业务消息设计
一,业务场景
消息下发到订单系统,不同的消息代表不同的订单业务逻辑
二,业务设计思路
1.关于消息:应该统一个格式,比如消息是xml或者json,应该定义统一的消息结构,方便后续统一解析处理
2.相同的处理逻辑:拿到消息后,需要统一解析处理,解析出核心业务消息体,传入相应业务处理逻辑
3.不同的逻辑:不同的消息,对应不同的业务处理逻辑
4.怎么区分不同的消息:发送消息时,定义一个参数如:tags,区分不同的业务消息
5.不同的消息怎么进入对应的业务处理中:根据tags,取到实现类
三,代码设计思路
代码:
1.接口
public interface BmsService {boolean execute(EccMessageReqVO eccMessageReqVO) throws Exception;BmsServiceEnum getType();
}
2.抽象类
@Component
@Slf4j
public abstract class AbstractBmsService implements BmsService {private static final String SHEET = "SHEET";@Override@Transactionalpublic boolean execute(EccMessageReqVO eccMessageReqVO) throws Exception {log.info("执行ecc-bms-mq消费消息service:{},入参:{}", eccMessageReqVO.getEccServiceName(),JSON.toJSONString(eccMessageReqVO));String message = eccMessageReqVO.getMessage();// JSONObject obj = JSON.parseObject(message).getJSONObject(SHEET);// if (Objects.nonNull(obj)) {// String msg = JSON.toJSONString(obj);// eccMessageReqVO.setMessage(msg);// }this.process(eccMessageReqVO);return true;}public abstract void process(EccMessageReqVO eccMessageReqVO) throws Exception;}
3.实现类
@Service
@Slf4j
public class ECCBMS152ServiceImpl extends AbstractBmsService {@Overridepublic void process(EccMessageReqVO eccMessageReqVO) throws Exception {String msaage = eccMessageReqVO.getMessage();log.info("ECCBMS152 message: {}", msaage);return;}@Overridepublic BmsServiceEnum getType() {return BmsServiceEnum.ECC_BMS152;}
}
设计模式:策略 +工厂+模板
类与接口:
一个接口:抽象类实现该接口,接口中包含两个方法,模板方法:抽象类实;区分不同业务类方法:子类实现
一个抽象类:解决上述2.3问题,共同的解析逻辑在抽象类中公共方法实现,定义一个抽象接口由不同业务实现类实现。方法:模板方法:处理共同逻辑; 抽象方法:子类实现
多个业务实现类:解决上述3,5问题,继承抽象类,实现抽象类中抽象方法:实现自己的业务;实现接口中方法:标记实现类本身,用于后续获取具体实现类
设计模式体现:
1.模板方法模式:抽象类:模板方法实现公共逻辑,抽象方法实现具体逻辑,
模板方法模式(模板方法设计模式)详解
2.策略模式:定义一个接口,不同子类实现自己类型逻辑
策略模式(策略设计模式)详解
3.抽象工厂:实现自己类型逻辑模型,也可以理解为抽象工厂。与策略很相似
抽象工厂模式(详解版)
抽象工厂简介:
抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。现在我们来分析其基本结构和实现方法。
抽象工厂模式的主要角色如下。
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
抽象工厂与代码对应关系
1.抽象工厂:对应接口
2.具体工厂:对应实现类
3.抽象产品:对应枚举类,接口中返回的枚举类
public enum BmsServiceEnum implements GenericStringEnum {ECC_BMS110("ECC_BMS110", "退货申请单上传-生鲜"),ECC_BMS110A("ECC_BMS110A", "退货申请单上传-食品用品"),
4.具体产品:子类接口中返回的具体商品,如:
public BmsServiceEnum getType() {return BmsServiceEnum.ECC_BMS152;}
四,上述第二点业务逻辑中第五点问题具体实现
利用多态,项目启动时,把所有实现类,存储到map中,key:枚举类,value:接口。消息下发时,根据tags取对应枚举,再根据枚举获取对应实现类,执行相应业务逻辑
@Component
public class BmsServiceSelector implements InitializingBean {private static final Map<BmsServiceEnum, BmsService> serviceMap = new HashMap<>();@Resourceprivate List<BmsService> EccServices;@Overridepublic void afterPropertiesSet() {for (BmsService service : EccServices) {serviceMap.put(service.getType(), service);}}public BmsService getService(BmsServiceEnum bmsServiceEnum) {if (null == bmsServiceEnum) {throw new IllegalArgumentException("操作失败!");}return serviceMap.get(bmsServiceEnum);}
}
五,思考
模板与策略区别
1.模板定义的是抽象类,策略定义的是接口
2.与子类关系:
抽象类:子类的执行结果可能返回来影响抽象的中的逻辑,即把子类处理的结果作为抽象类中其他逻辑的参数,进一步处理。
策略:没有上述抽象类,反向影响的逻辑
策略与工厂区别
相同点:都是通过定义接口实现
不同点:工厂涉及抽象产品,具体产品,通过多态体现;策略:上述实现通过枚举体现
理解错误的地方,欢迎留言指正交流,谢谢!
订单接收不同业务消息设计相关推荐
- PHP-企业微信二次开发-接收用户输入消息内容并响应相关业务逻辑
企业微信接收用户输入消息内容并响应 前面一节说明了企业微信设置API接收,服务器回调配置的一些说明.这一节我们接着后面的内容来讲下在企业微信中,如何通过应用,接收用户消息. 业务逻辑:企业微信向回调地 ...
- ENode框架Conference案例分析系列之 - 订单处理减库存的设计
前言 前面的文章,我介绍了Conference案例的业务.上下文划分.领域模型.架构,以及代码整体流程.接下来想针对案例中一些重要的场景,分别做进一步的分析.本文想先介绍一下Conference案例的 ...
- 微服务架构案例(02):业务架构设计,系统分层管理
本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 一.业务架构设计 1.基础概念 服务的架构设计决 ...
- 作为日千万订单级别的业务,美团外卖的后端服务是怎么支撑的
写在前面 2018年4月,中国外卖市场迎来巨变,外卖从无人问津开始,到现在已经培育成互联网巨头必争之地.作为为数不多能够达到日千万订单级别的业务,其后端服务是怎么支撑的?InfoQ采访了ArchSum ...
- 电商项目中订单系统到底该怎么设计才好?(至尊典藏版)
目录 前言 一.订单系统架构 1. 订单系统在企业中的角色 2. 订单系统与各业务系统的关系 3. 订单系统上下游关系编辑 4. 订单系统的业务架构编辑 二.订单系统核心功能 1. 订单中所包含的 ...
- 从源码分析RocketMQ系列-RocketMQ消息设计详解
1 消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构.PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三 ...
- QMQ顺序消息设计与实现
背景 在MQ里,顺序消息的意思是消费消息的顺序和消息发送时(单机发送)的顺序保持一致.比如ProducerA按照顺序发送msga, msgb, msgc三条消息,那么consumer消费的时候也应该按 ...
- 业务消息中心系统设计与实现(一)
目录 解决问题场景? 那么这款内部业务消息中心需要满足哪些功能呢? 哈喽小伙伴,我是kilde,和有需要的小伙伴分享一个业务消息中心的设计思想与实现,喜欢的小伙伴可以点赞关注博主,觉得有用的也可以打赏 ...
- 中台之上(三):战略和组织结构,业务架构设计中不应被忽视的关键因素
业务架构的起点:解读企业战略 \n 业务架构最大的特点就是要从企业整体视角出发思考问题,要有居高临下的俯视视角,时刻有一张企业整体的业务能力地图印在脑子里,而企业的业务能力是服务于业务目标的,业务目标 ...
- 微信公众号开发之接收与发送消息
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 在上一篇博客中已经验证了服务器有效性:https://blog.csdn.net/qq_41782425/article/deta ...
最新文章
- JVM实战与原理---Class文件结构
- boost::coroutines模块实现斐波那契的测试程序
- Eclipse中显示文件字符乱码
- 只会python怎么挣钱_业余学python有用吗
- C++小型公司管理系统
- python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
- Selenium 执行JavaScript语句
- MySQL基础总结,认真看完这篇就够了!!!
- 设为首页和加入收藏js
- 人类视觉计算理论经典著作,豆瓣评分9.7,中文版惊鸿面世
- 微服务架构实战篇(二):Spring boot2.0 + Swagger2 让你的API可视化
- 基坑监测日报模板_基坑水平监测日报表
- mac中使用QuickTime Player看了移动硬盘里的视频,如何清除记录?
- Gabor变换(1)
- Dart中的Isolate
- KMP(字符串匹配)+字符串哈希
- 全能在线APP一款开源的多功能在线学习考试智慧软件系统
- 远程桌面连接报错解决方法
- 【笔记】效率脑科学:卓有成效地完成每一项工作
- 云里黑白第一回——华硕mbr机械硬盘迁移到m.2固态,3秒开机