文章目录
适配器模式介绍
- 适配器模式介绍
- 适配器模式实战
- 不使用适配器模式的写法
- 使用适配器模式的写法
- mq消息适配
- 接口适配
把原本不兼容的接口, 进行改造, 让其进行统一适配, 方便各种形式的使用. 开发中, 类似中台业务, 订单有很多的来源, 把接收订单的接口进行封装, 适配各种订单进入中台.
适配器模式实战模拟MQ消息. 有开户消息 , 自营订单消息, 第三方店铺订单消息, 都要通过mq进行处理. 粗暴的写法是每一个消息都写一个类处理. 而使用适配器模式后, 可以把消息进行统一字段封装, 放在一个类进行处理.
创建 tutorials-9.0-0 模块. 创建各种mq消息实体类 . 开户实体类
public class Create_account {
private String number; // 账户编号
private String address; // 开户地
private Date accountDate; // 开户时间
private String desc; // 开户描述
// get set toString
}
自营订单实体类
public class OrderMq {
private String uid; // 用户id
private String sku; // 商品sku
private String orderId; // 订单id
private Date createOrderTime; // 下单时间
}
第三方卖家订单实体类
public class POPOrderDelivered {
private String uId; // 用户ID
private String orderId; // 订单号
private Date orderTime; // 下单时间
private Date sku; // 商品
private Date skuName; // 商品名称
private BigDecimal decimal; // 金额
}
查询自营订单下单数量
public class OrderService {
private Logger logger = LoggerFactory.getLogger(OrderService.class);
public long queryUserOrderCount(String userId) {
logger.info("自营商家, 查询用户的订单是否为首单: {}", userId);
return 10L; // 此处模拟数据库查询出来的为10单
}
}
查询第三方卖家订单数量
public class POPOrderService {
private Logger logger = LoggerFactory.getLogger(POPOrderService.class);
public boolean isFirstOrder(String uId) {
logger.info("POP商家 查询用户的订单是否为首单 : {}", uId);
return true;
}
}
不使用适配器模式的写法
创建tutorials-9.0-1 模块. pom中引入tutorials-9.0-0模块 创建处理账户的类
public class Create_AccountMqService {
public void onMessage(String message) {
Create_account mq = JSON.parseObject(message, Create_account.class);
mq.getNumber();
mq.getAccountDate();
// 处理业务
}
}
处理自营订单的类
public class OrderMqService {
public void onMessage(String message) {
OrderMq mq = JSON.parseObject(message, OrderMq.class);
mq.getUid();
//处理自营订单的业务
}
}
第三方店铺订单的类
public class POPOrderDeliverdService {
public void onMessage(String message) {
// 处理pop 店的订单消息
POPOrderDelivered mq = JSON.parseObject(message, POPOrderDelivered.class);
mq.getuId();
mq.getOrderId();
}
}
这种写法就是一个消息类型,来建立一个类进行处理.
使用适配器模式的写法 mq消息适配使用适配器模式来处理mq消息. 创建RebateInfo类, 来进行消息的统一处理封装.
public class RebateInfo {
private String userId; // 用户id
private String bizId; // 业务id
private Date bizTime; // 业务时间
private String desc ; // 业务描述
// get set toString
public void setBizTime(String bizTime) {
this.bizTime = new Date(Long.parseLong("1591077840669"));
}
}
创建MQAdapter 消息适配器类, 把消息转化为map , 并通过反射赋值给RebateInfo
public class MQAdapter {
public static RebateInfo filter(String strJson, Map link) throws Exception {
return filter(JSON.parseObject(strJson, Map.class), link);
}
public static RebateInfo filter(Map obj, Map link) throws Exception {
RebateInfo rebateInfo = new RebateInfo();
for (String key : link.keySet()) {
Object val = obj.get(link.get(key));
// 用反射, 并且把RebateInfo对象的set方法根据link 取值.
RebateInfo.class.getMethod("set" + key.substring(0, 1).toUpperCase() + key.substring(1), String.class)
.invoke(rebateInfo, val.toString());
}
return rebateInfo;
}
}
进行测试
@Test
public void test_MQAdapter() throws Exception {
Create_account create_account = new Create_account();
create_account.setNumber("100001");
create_account.setAddress("中国 北京 朝阳区");
create_account.setAccountDate(new Date());
create_account.setDesc("开户");
HashMap link01 = new HashMap();
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("1000001");
orderMq.setSku("10043242");
orderMq.setOrderId("100000234344444");
orderMq.setCreateOrderTime(new Date());
HashMap link02 = new HashMap();
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));
}
控制台打印如下. 可以看到不同的消息 ,都进行了统一的适配封装.
mq.create_account(适配前){"accountDate":1647747993709,"address":"中国 北京 朝阳区","desc":"开户","number":"100001"}
mq.create_account(适配后){"bizId":"100001","bizTime":1591077840669,"desc":"开户","userId":"100001"}
mq.orderMq(适配前){"createOrderTime":1647747993819,"orderId":"100000234344444","sku":"10043242","uid":"1000001"}
mq.orderMq(适配后){"bizId":"100000234344444","bizTime":1591077840669,"userId":"1000001"}
接口适配
创建OrderAdapterService接口
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)
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?