适配器模式(不同类型的 MQ 消息 首次下单消息)

目录

定义

适配不同类型的 MQ 消息

注册开户MQ

内部订单MQ

第三⽅订单MQ

查询⽤户内部下单数量接⼝

查询⽤户第三⽅下单⾸单接⼝

MQ消息体适配类

代码实现

测试验证

接⼝使⽤适配

代码实现

分别实现两个不同的接⼝

内部商品接⼝

第三⽅商品接⼝

测试验证


定义

适配器模式的主要作⽤就是把原本不兼容的接⼝,通过适配修改做到统⼀。使得⽤户⽅便使⽤。

适配不同类型的 MQ 消息

做这样⼀个系统就会接收各种各样的MQ消息或者接⼝,如果⼀个个的去开发,就会耗费很⼤的成本,同时对于后期的拓展也有⼀定的难度。此时就会希望有⼀个系统可以配置⼀下就把外部的MQ接⼊进⾏,这些MQ就像上⾯提到的可能是⼀些注册开户消息、商品下单消息等等。

注册开户MQ

public class create_account {private String number; // 开户编号private String address; // 开户地private Date accountDate; // 开户时间private String desc; // 开户描述// ... get/set 
}

内部订单MQ

public class OrderMq {private String uid; // ⽤户IDprivate String sku; // 商品private String orderId; // 订单IDprivate Date createOrderTime; // 下单时间 // ... get/set 
}

第三⽅订单MQ

public class POPOrderDelivered {private String uId; // ⽤户IDprivate String orderId; // 订单号private Date orderTime; // 下单时间private Date sku; // 商品private Date skuName; // 商品名称private BigDecimal decimal; // ⾦额// ... get/set 
}

查询⽤户内部下单数量接⼝

public class OrderService {private Logger logger = LoggerFactory.getLogger(POPOrderService.class);public long queryUserOrderCount(String userId){logger.info("⾃营商家,查询⽤户的订单是否为⾸单:{}", userId);return 10L;}
}

查询⽤户第三⽅下单⾸单接⼝

public class POPOrderService {private Logger logger = LoggerFactory.getLogger(POPOrderService.class);public boolean isFirstOrder(String uId) {logger.info("POP商家,查询⽤户的订单是否为⾸单:{}", uId);return true;}
}

MQ消息体适配类

代码实现

public class MQAdapter {public static RebateInfo filter(String strJson, Map<String, String> link) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {return filter(JSON.parseObject(strJson, Map.class), link);}public static RebateInfo filter(Map obj, Map<String, String> link) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {RebateInfo rebateInfo = new RebateInfo();for (String key : link.keySet()) {Object val = obj.get(link.get(key));RebateInfo.class.getMethod("set" + key.substring(0, 1).toUpperCase() + key.substring(1), String.class).invoke(rebateInfo, val.toString());}return rebateInfo;}
}

主要⽤于把不同类型MQ种的各种属性,映射成我们需要的属性并返回。就像⼀个属性中有 ⽤户ID;uId ,映射到我们需要的; userId ,做统⼀处理。

测试验证

@Test
public void test_MQAdapter() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {create_account create_account = new create_account();create_account.setNumber("100001");create_account.setAddress("河北省.廊坊市.⼴阳区.⼤学⾥职业技术学院");create_account.setAccountDate(new Date());create_account.setDesc("在校开户"); HashMap<String, String> link01 = new HashMap<String, String>();link01.put("userId", "number");link01.put("bizId", "number");link01.put("bizTime", "accountDate");link01.put("desc", "desc");RebateInfo rebateInfo01 = MQAdapter.filter(create_account.toString(), link01);System.out.println("mq.create_account(适配前)" + create_account.toString());System.out.println("mq.create_account(适配后)" + JSON.toJSONString(rebateInfo01));System.out.println("");OrderMq orderMq = new OrderMq();orderMq.setUid("100001");orderMq.setSku("10928092093111123");orderMq.setOrderId("100000890193847111");orderMq.setCreateOrderTime(new Date());HashMap<String, String> link02 = new HashMap<String, String>();link02.put("userId", "uid");link02.put("bizId", "orderId");link02.put("bizTime", "createOrderTime");RebateInfo rebateInfo02 = MQAdapter.filter(orderMq.toString(), link02);System.out.println("mq.orderMq(适配前)" + orderMq.toString());System.out.println("mq.orderMq(适配后)" + JSON.toJSONString(rebateInfo02));
}

接⼝使⽤适配

代码实现

public interface OrderAdapterService {boolean isFirst(String uId);
}

分别实现两个不同的接⼝

内部商品接⼝
public class InsideOrderService implements OrderAdapterService {private OrderService orderService = new OrderService();public boolean isFirst(String uId) {return orderService.queryUserOrderCount(uId) <= 1;}
}
第三⽅商品接⼝
public class POPOrderAdapterServiceImpl implements OrderAdapterService {private POPOrderService popOrderService = new POPOrderService();public boolean isFirst(String uId) {return popOrderService.isFirstOrder(uId);}
}

测试验证

@Test
public void test_itfAdapter() {OrderAdapterService popOrderAdapterService = new POPOrderAdapterServiceImpl();System.out.println("判断⾸单,接⼝适配(POP):" + popOrderAdapterService.isFirst("100001")); OrderAdapterService insideOrderService = new InsideOrderService();System.out.println("判断⾸单,接⼝适配(⾃营):" + insideOrderService.isFirst("100001"));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用递归方式实现多级菜单树 Java实现

在Java中&#xff0c;使用递归来实现菜单树通常涉及到遍历原始菜单列表&#xff0c;并为每个菜单项找到其对应的子菜单项。这个过程可以通过创建一个方法来完成&#xff0c;该方法会检查每个菜单项的parentId&#xff0c;并将其作为子菜单项添加到具有相应id的父菜单项的childr…

web前端学习笔记2

2. 网页穿上美丽外衣 2.0 代码地址 https://gitee.com/qiangge95243611/java118/tree/master/web/day02 2.1 什么是CSS CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言,CSS 文…

docker学习笔记7:centos docker安装mysql

在 CentOS 系统上使用 Docker 安装 MySQL 8 的过程相对简单。以下是一步步的指导: 1. 确保 Docker 已经安装 首先,你需要确保你的 CentOS 系统上已经安装了 Docker。可以通过以下命令检查 Docker 是否已经安装并且运行: sudo systemctl status docker如果 Docker 没有安装…

文件系统学习

软连接&#xff1a;可以跨不同的磁盘块&#xff0c;创建出不同的inode节点 应连接&#xff1a;相同的inode节点&#xff0c;不同的文件名字记录在父亲节点目录中 分区(fdisk)&#xff0c;格式化(mkfs)&#xff0c;挂载(mount)&#xff0c;大于2T分区&#xff08;parted&#…

FSNotes for Mac v6.7.1中文激活版:强大的笔记管理工具

FSNotes for Mac是一款功能强大的文本处理与笔记管理工具&#xff0c;为Mac用户提供了一个直观、高效的笔记记录和整理平台。 FSNotes for Mac v6.7.1中文激活版下载 FSNotes支持Markdown语法&#xff0c;使用户能够轻松设置笔记格式并添加链接、图像等元素&#xff0c;实现笔记…

前端调用WebSocket协议接口获取数据

目录 封装调用ws协议接口工具函数 页面调用 封装调用ws协议接口工具函数 params&#xff1a;请求参数cb&#xff1a;服务器请求成功返回数据的回调函数 function createWs(params, cb) {const ws new WebSocket("ws://124.222.224.186:8800");let timer null;// …

基于H.264的RTP打包中的组合封包以及分片封包结构图简介及抓包分析;FU-A FU-B STAP-A STAP-B简介;

H.264视频流的RTP封装类型分析&#xff1a; 前言&#xff1a; 1.RTP打包原则&#xff1a; RTP的包长度必须要小于MTU(最大传输单元)&#xff0c;IP协议中MTU的最大长度为1500字节。除去IP报头&#xff08;20字节&#xff09;、UDP报头&#xff08;8字节&#xff09;、RTP头&a…

C#编程模式之装饰模式

创作背景&#xff1a;朋友们&#xff0c;我们继续C#编程模式的学习&#xff0c;本文我们将一起探讨装饰模式。装饰模式也是一种结构型设计模式&#xff0c;它允许你通过在运行时向对象添加额外的功能&#xff0c;从而动态的修改对象的行为。装饰模式本质上还是继承的一种替换方…

机器学习-什么是 k-means?

1、什么是 k-means&#xff1f; k-means是一种无监督的分类学习算法。它的基本原理是以距离作为相似度的评价指标&#xff0c;用样本点到类别中心的误差平方和作为聚类好坏的评价指标&#xff0c;通过迭代的方法使总体分类的误差评分和函数达到最小的聚类方法。 2、 k-means聚…

设计模式 基本认识

文章目录 设计模式的作用设计模式三原则设计模式与类图设计模式的分类 设计模式的作用 设计模式是在软件设计过程中针对常见问题的解决方案的一种通用、可重用的解决方案。设计模式提供了一种经过验证的方法&#xff0c;可以帮助开发人员解决特定类型的问题&#xff0c;并在软…

【论文阅读】IPT:Pre-TrainedImageProcessingTransformer

Pre-TrainedImageProcessingTransformer 论文地址摘要1. 简介2.相关作品2.1。图像处理2.2。 Transformer 3. 图像处理3.1. IPT 架构3.2 在 ImageNet 上进行预训练 4. 实验4.1. 超分辨率4.2. Denoising 5. 结论与讨论 论文地址 1、论文地址 2、源码 摘要 随着现代硬件的计算能…

1394 笔记

RN节点工作模块&#xff0c;当接收到STOF包后开始计时&#xff0c;当达到节点的发送、接收、数据泵偏移时向应用层发送相应使能。并根据STOF判断CC的错误状态&#xff0c;只有以下条件全部满足时进入正常工作模式&#xff1a; 条件1&#xff0c;STOF消息的帧周期正确&#xff…

mybatis工程需要的pom.xml,以及@Data 、@BeforeEach、@AfterEach 的使用,简化mybatis

对 “mybatis - XxxMapper.java接口中方法的参数 和 返回值类型&#xff0c;怎样在 XxxMapper.xml 中配置的问题” 这篇文章做一下优化 这个pom.xml文件&#xff0c;就是上面说的这篇文章的父工程的pom.xml&#xff0c;即&#xff1a;下面这个pom.xml 是可以拿来就用的 <?…

7天入门Android开发之第1天——初识Android

一、Android系统 1.Linux内核层&#xff1a; 这是安卓系统的底层&#xff0c;它提供了基本的系统功能&#xff0c;如内存管理、进程管理、驱动程序模型等。安卓系统构建在Linux内核之上&#xff0c;借助于Linux的稳定性和安全性。 2.系统运行库层&#xff1a; 这一层包括了安卓…

Java高级面试问题及答案

Java高级面试问题及答案 1. 什么是Java中的多态性&#xff1f;如何实现多态性&#xff1f; 问题描述&#xff1a; 多态性是面向对象编程的重要概念之一&#xff0c;它允许不同类的对象对同一消息做出不同的响应。请简要说明Java中的多态性&#xff0c;并描述如何实现多态性。…

短剧小程序开发,为什么短剧市场越来越火爆?

大众眼帘&#xff0c;但是不可否认现在短剧的质量也处在一个不断上升的阶段&#xff0c;我们今天就来分析分析短剧市场兴起的原因吧&#xff5e; 一、大趋势大环境的影响下&#xff0c;很多新型行业诞生&#xff0c;多数行业都在精进变化和改革&#xff0c;淘汰旧思想&#xf…

MYSQL 8.0的Linux - Generic版本安装

1.本文适用范围 适用于MYSQL 8.0的Linux - Generic版本&#xff0c;原则上适用所有的操作系统。已测试的操作系统包括&#xff1a; Ubuntu 16.04Ubuntu 18.04Ubuntu 20.04Ubuntu 22.04Kylin Linux Advanced Server V10 ​ 注意&#xff1a;如果操作系统使用过包管理系统&…

深入理解Java消息中间件-使用Spring Framework进行消息驱动的开发

结合Spring Framework&#xff0c;特别是Spring for Apache Kafka项目&#xff0c;Java开发者可以更加便捷高效地实现Kafka的生产者和消费者应用。本文将详细介绍如何在Spring环境中开发Kafka应用&#xff0c;确保内容的准确性并避免技术误导。 环境准备 首先&#xff0c;确保您…

GITEE本地项目上传到远程

由于需要&#xff0c;我这边将本地的仓库上传至GITEE。之前在网上搜索了相关的文档&#xff0c;但是步骤很繁琐&#xff0c;我这边介绍一个非常简单的。 一、在GITEE新建仓库 跟着指引一步步新建。 二、打开本地仓库&#xff0c;删除.git文件 默认情况下不会有这个.git文件&a…

【全面认知YOLO系列】看见未来:目标检测技术在各行业应用的全景解读第二部分

【全面认知YOLO系列】看见未来&#xff1a;目标检测技术在各行业应用的全景解读第二部分 一、目标检测技术在环境保护上的应用1、野生动物监测&#xff1a;2、森林火灾早期检测&#xff1a;3、水体污染监测&#xff1a;4、空气质量监测&#xff1a;5、垃圾分类与回收&#xff1…