一,业务场景

消息下发到订单系统,不同的消息代表不同的订单业务逻辑

二,业务设计思路

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 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。现在我们来分析其基本结构和实现方法。

抽象工厂模式的主要角色如下。

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(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.与子类关系:

抽象类:子类的执行结果可能返回来影响抽象的中的逻辑,即把子类处理的结果作为抽象类中其他逻辑的参数,进一步处理。

策略:没有上述抽象类,反向影响的逻辑

策略与工厂区别

相同点:都是通过定义接口实现

不同点:工厂涉及抽象产品,具体产品,通过多态体现;策略:上述实现通过枚举体现

理解错误的地方,欢迎留言指正交流,谢谢!

订单接收不同业务消息设计相关推荐

  1. PHP-企业微信二次开发-接收用户输入消息内容并响应相关业务逻辑

    企业微信接收用户输入消息内容并响应 前面一节说明了企业微信设置API接收,服务器回调配置的一些说明.这一节我们接着后面的内容来讲下在企业微信中,如何通过应用,接收用户消息. 业务逻辑:企业微信向回调地 ...

  2. ENode框架Conference案例分析系列之 - 订单处理减库存的设计

    前言 前面的文章,我介绍了Conference案例的业务.上下文划分.领域模型.架构,以及代码整体流程.接下来想针对案例中一些重要的场景,分别做进一步的分析.本文想先介绍一下Conference案例的 ...

  3. 微服务架构案例(02):业务架构设计,系统分层管理

    本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 一.业务架构设计 1.基础概念 服务的架构设计决 ...

  4. 作为日千万订单级别的业务,美团外卖的后端服务是怎么支撑的

    写在前面 2018年4月,中国外卖市场迎来巨变,外卖从无人问津开始,到现在已经培育成互联网巨头必争之地.作为为数不多能够达到日千万订单级别的业务,其后端服务是怎么支撑的?InfoQ采访了ArchSum ...

  5. 电商项目中订单系统到底该怎么设计才好?(至尊典藏版)

    目录 前言 一.订单系统架构 1. 订单系统在企业中的角色 2. 订单系统与各业务系统的关系 3. 订单系统上下游关系​编辑 4. 订单系统的业务架构​编辑 二.订单系统核心功能 1. 订单中所包含的 ...

  6. 从源码分析RocketMQ系列-RocketMQ消息设计详解

    1 消息存储   消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构.PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三 ...

  7. QMQ顺序消息设计与实现

    背景 在MQ里,顺序消息的意思是消费消息的顺序和消息发送时(单机发送)的顺序保持一致.比如ProducerA按照顺序发送msga, msgb, msgc三条消息,那么consumer消费的时候也应该按 ...

  8. 业务消息中心系统设计与实现(一)

    目录 解决问题场景? 那么这款内部业务消息中心需要满足哪些功能呢? 哈喽小伙伴,我是kilde,和有需要的小伙伴分享一个业务消息中心的设计思想与实现,喜欢的小伙伴可以点赞关注博主,觉得有用的也可以打赏 ...

  9. 中台之上(三):战略和组织结构,业务架构设计中不应被忽视的关键因素

    业务架构的起点:解读企业战略 \n 业务架构最大的特点就是要从企业整体视角出发思考问题,要有居高临下的俯视视角,时刻有一张企业整体的业务能力地图印在脑子里,而企业的业务能力是服务于业务目标的,业务目标 ...

  10. 微信公众号开发之接收与发送消息

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 在上一篇博客中已经验证了服务器有效性:https://blog.csdn.net/qq_41782425/article/deta ...

最新文章

  1. JVM实战与原理---Class文件结构
  2. boost::coroutines模块实现斐波那契的测试程序
  3. Eclipse中显示文件字符乱码
  4. 只会python怎么挣钱_业余学python有用吗
  5. C++小型公司管理系统
  6. python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
  7. Selenium 执行JavaScript语句
  8. MySQL基础总结,认真看完这篇就够了!!!
  9. 设为首页和加入收藏js
  10. 人类视觉计算理论经典著作,豆瓣评分9.7,中文版惊鸿面世
  11. 微服务架构实战篇(二):Spring boot2.0 + Swagger2 让你的API可视化
  12. 基坑监测日报模板_基坑水平监测日报表
  13. mac中使用QuickTime Player看了移动硬盘里的视频,如何清除记录?
  14. Gabor变换(1)
  15. Dart中的Isolate
  16. KMP(字符串匹配)+字符串哈希
  17. 全能在线APP一款开源的多功能在线学习考试智慧软件系统
  18. 远程桌面连接报错解决方法
  19. 【笔记】效率脑科学:卓有成效地完成每一项工作
  20. 云里黑白第一回——华硕mbr机械硬盘迁移到m.2固态,3秒开机

热门文章

  1. mysql配置数据库的不同权限用户
  2. 获取ul下li标签里点击的是哪一个li并获取li里a标签的值
  3. Eclipse之Android开发环境搭建
  4. Ekho TTS 5.1发布
  5. 带着梦想,追逐属于你我的那份真彩
  6. 漫画:如何将一个链表“逆序”?
  7. QEMU学习笔记——QOM(Qemu Object Model)
  8. 使用 Vi/Vim 编辑器:基础篇
  9. Java的arrays运用
  10. python相关函数_Python 函数相关概念