当前位置: 首页 > news >正文

永嘉做网站建设工程施工合同范本哪个网站

永嘉做网站,建设工程施工合同范本哪个网站,采集网站seo,flash个人网站首页模板前言 工作到3年左右很大一部分程序员都想提升自己的技术栈#xff0c;开始尝试去阅读一些源码#xff0c;例如Spring、Mybaits、Dubbo等#xff0c;但读着读着发现越来越难懂#xff0c;一会从这过来一会跑到那去。甚至怀疑自己技术太差#xff0c;慢慢也就不愿意再触碰这…前言 工作到3年左右很大一部分程序员都想提升自己的技术栈开始尝试去阅读一些源码例如Spring、Mybaits、Dubbo等但读着读着发现越来越难懂一会从这过来一会跑到那去。甚至怀疑自己技术太差慢慢也就不愿意再触碰这部分知识。 框架中用到了设计模式吗 架中不仅用到设计模式还用了很多而且有些时候根本不是一个模式的单独使用而是多种设计模式的综合运用。与大部分小伙伴平时开发的CRUD可就不一样了如果都是if语句从上到下也就算得不上什么框架了。就像你到Spring的源码中搜关键字Adapter就会出现很多实现类例如 UserCredentialsDataSourceAdapter。而这种设计模式就是我们本文要介绍的适配器模式。 适配器模式 适配器模式的主要作用就是把原本不兼容的接口通过适配修改做到统一。使得用户方便使用就像我们提到的万能充、数据线、MAC笔记本的转换头、出国旅游买个插座等等他们都是为了适配各种不同的口做的兼容。。 在业务开发中我们会经常的需要做不同接口的兼容尤其是中台服务中台需要把各个业务线的各种类型服务做统一包装再对外提供接口进行使用。而这在我们平常的开发中也是非常常见的。 做一些营销系统大部分常见的都是裂变、拉客例如你邀请一个用户开户、或者邀请一个用户下单那么平台就会给你返利多邀多得。同时随着拉新的量越来越多开始设置每月下单都会给首单奖励等等各种营销场景。 那么这个时候做这样一个系统就会接收各种各样的MQ消息或者接口如果一个个的去开发就会耗费很大的成本同时对于后期的拓展也有一定的难度。此时就会希望有一个系统可以配置一下就把外部的MQ接入进行这些MQ就像上面提到的可能是一些注册开户消息、商品下单消息等等。 1这里模拟了三个不同类型的MQ消息而在消息体中都有一些必要的字段比如用户ID、时间、业务ID但是每个MQ的字段属性并不一样。就像用户ID在不同的MQ里也有不同的字段uId、userId等。 2同时还提供了两个不同类型的接口一个用于查询内部订单订单下单数量一个用于查询第三方是否首单。 3后面会把这些不同类型的MQ和接口做适配兼容。 注册开户MQ package com.lm.design.mq;import com.alibaba.fastjson.JSON;import java.util.Date;/*** 开户*/ public class create_account {private String number; // 开户编号private String address; // 开户地private Date accountDate; // 开户时间private String desc; // 开户描述public String getNumber() {return number;}public void setNumber(String number) {this.number number;}public String getAddress() {return address;}public void setAddress(String address) {this.address address;}public Date getAccountDate() {return accountDate;}public void setAccountDate(Date accountDate) {this.accountDate accountDate;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc desc;}Overridepublic String toString() {return JSON.toJSONString(this);} } 内部订单MQ package com.lm.design.mq;import com.alibaba.fastjson.JSON;import java.util.Date;public class OrderMq {private String uid; // 用户IDprivate String sku; // 商品private String orderId; // 订单IDprivate Date createOrderTime; // 下单时间public String getUid() {return uid;}public void setUid(String uid) {this.uid uid;}public String getSku() {return sku;}public void setSku(String sku) {this.sku sku;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId orderId;}public Date getCreateOrderTime() {return createOrderTime;}public void setCreateOrderTime(Date createOrderTime) {this.createOrderTime createOrderTime;}Overridepublic String toString() {return JSON.toJSONString(this);} } 第三方订单MQ package com.lm.design.mq;import com.alibaba.fastjson.JSON;import java.math.BigDecimal; import java.util.Date;/*** 订单妥投消息*/ public class POPOrderDelivered {private String uId; // 用户IDprivate String orderId; // 订单号private Date orderTime; // 下单时间private Date sku; // 商品private Date skuName; // 商品名称private BigDecimal decimal; // 金额public String getuId() {return uId;}public void setuId(String uId) {this.uId uId;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId orderId;}public Date getOrderTime() {return orderTime;}public void setOrderTime(Date orderTime) {this.orderTime orderTime;}public Date getSku() {return sku;}public void setSku(Date sku) {this.sku sku;}public Date getSkuName() {return skuName;}public void setSkuName(Date skuName) {this.skuName skuName;}public BigDecimal getDecimal() {return decimal;}public void setDecimal(BigDecimal decimal) {this.decimal decimal;}Overridepublic String toString() {return JSON.toJSONString(this);}} 查询用户内部下单数量接口 package com.lm.design.service;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class OrderService {private Logger logger LoggerFactory.getLogger(POPOrderService.class);public long queryUserOrderCount(String userId){logger.info(自营商家查询用户的订单是否为首单{}, userId);return 10L;}} 查询用户第三方下单首单接口 package com.lm.design.service;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class POPOrderService {private Logger logger LoggerFactory.getLogger(POPOrderService.class);public boolean isFirstOrder(String uId) {logger.info(POP商家查询用户的订单是否为首单{}, uId);return true;}} 用一坨坨代码实现 Mq接收消息实现 package com.lm.design;import com.alibaba.fastjson.JSON; import com.lm.design.mq.create_account;public class create_accountMqService {public void onMessage(String message) {create_account mq JSON.parseObject(message, create_account.class);mq.getNumber();mq.getAccountDate();// ... 处理自己的业务}} 适配器模式重构代码 适配器模式要解决的主要问题就是多种差异化类型的接口做统一输出这在我们学习工厂方法模式中也有所提到不同种类的奖品处理其实那也是适配器的应用。 在本文中我们还会再另外体现出一个多种MQ接收使用MQ的场景。来把不同类型的消息做统一的处理便于减少后续对MQ接收。 这里包括了两个类型的适配接口适配、MQ适配。之所以不只是模拟接口适配因为很多时候大家都很常见了所以把适配的思想换一下到MQ消息体上增加大家多设计模式的认知。 先是做MQ适配接收各种各样的MQ消息。当业务发展的很快需要对下单用户首单才给奖励在这样的场景下再增加对接口的适配操作。 MQ消息适配 统一的MQ消息体 package com.lm.design;import java.util.Date;public class RebateInfo {private String userId; // 用户IDprivate String bizId; // 业务IDprivate Date bizTime; // 业务时间private String desc; // 业务描述public String getUserId() {return userId;}public void setUserId(String userId) {this.userId userId;}public String getBizId() {return bizId;}public void setBizId(String bizId) {this.bizId bizId;}public Date getBizTime() {return bizTime;}public void setBizTime(Date bizTime) {this.bizTime bizTime;}public void setBizTime(String bizTime) {this.bizTime new Date(Long.parseLong(1591077840669));}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc desc;} } MQ消息中会有多种多样的类型属性虽然他们都有同样的值提供给使用方但是如果都这样接入那么当MQ消息特别多时候就会很麻烦。 MQ消息体适配类 package com.lm.design;import com.alibaba.fastjson.JSON;import java.lang.reflect.InvocationTargetException; import java.util.Map;public class MQAdapter {public static RebateInfo filter(String strJson, MapString, String link) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {return filter(JSON.parseObject(strJson, Map.class), link);}public static RebateInfo filter(Map obj, MapString, 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做统一处理。 而在这个处理过程中需要把映射管理传递给MapString, String link也就是准确的描述了当前MQ中某个属性名称映射为我们的某个属性名称。 最终因为我们接收到的mq消息基本都是json格式可以转换为MAP结构。最后使用反射调用的方式给我们的类型赋值。 编写单元测试 package com.lm.design.test;import com.alibaba.fastjson.JSON; import com.lm.design.MQAdapter; import com.lm.design.OrderAdapterService; import com.lm.design.RebateInfo; import com.lm.design.cuisine.impl.InsideOrderService; import com.lm.design.cuisine.impl.POPOrderAdapterServiceImpl; import com.lm.design.mq.OrderMq; import com.lm.design.mq.create_account; import org.junit.Test;import java.lang.reflect.InvocationTargetException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap;public class ApiTest {Testpublic void test_MQAdapter() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ParseException {SimpleDateFormat s new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);Date parse s.parse(2020-06-01 23:20:16);create_account create_account new create_account();create_account.setNumber(100001);create_account.setAddress(河北省.廊坊市.广阳区.大学里职业技术学院);create_account.setAccountDate(parse);create_account.setDesc(在校开户);HashMapString, String link01 new HashMapString, 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(parse);HashMapString, String link02 new HashMapString, 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));}Testpublic void test_itfAdapter() {OrderAdapterService popOrderAdapterService new POPOrderAdapterServiceImpl();System.out.println(判断首单接口适配(POP) popOrderAdapterService.isFirst(100001));OrderAdapterService insideOrderService new InsideOrderService();System.out.println(判断首单接口适配(自营) insideOrderService.isFirst(100001));}} 在这里我们分别模拟传入了两个不同的MQ消息并设置字段的映射关系。 总结 1到不使用适配器模式这些功能同样可以实现但是使用了适配器模式就可以让代码干净整洁易于维护、减少大量重复的判断和使用、让代码更加易于维护和拓展。 2尤其是我们对MQ这样的多种消息体中不同属性同类的值进行适配再加上代理类就可以使用简单的配置方式接入对方提供的MQ消息而不需要大量重复的开发。非常利于拓展。 好了 至此 设计模式之适配器模式(从多个MQ消息体中抽取指定字段值场景 学习结束了 友友们 点点关注不迷路 老铁们
http://www.dnsts.com.cn/news/267491.html

相关文章:

  • 深圳网站开发平台桂林论坛天涯社区
  • 音乐网站首页设计轻博客 wordpress
  • 山东丽天建设集团网站怎么看网站后台什么语言做的
  • 洛阳微网站建设深圳个性化建网站服务商
  • 池州网站建设电话专业集团门户网站建设
  • 淘宝网站内站建设平面设计主要内容
  • 莱州教育网站怎样在wordpress里添加菜单
  • 网站建设与制作模板关于建设网站的申请报告
  • 南京html5网站建设嘉兴市秀洲区住房和建设局网站
  • 专题类响应式网站建设问答推广的优势和不足
  • 合肥大型网站开发公司wordpress鼠标点击
  • 上海网站建设雍熙云南培训网站建设
  • 凡科做网站在百度能看见吗做社群最好的网站源码
  • 有没有给宝宝做辅食的网站wordpress产品展示插件
  • 网站的数据库怎么建立二手东西怎么挂网上卖
  • 个人网站可以做哪些主题网站建设设计报告前言
  • 河南做网站哪家好学短视频剪辑与制作
  • 浙江创新网站建设销售最好的免费网站空间
  • 网站怎么创建自己的网站中国网库企业黄页
  • 杭州海淀区网站建设深圳企业贷款中介
  • 网站背景图建站语言有哪些
  • 贵州建站互联网科技有限公司丹东网站seo
  • 主题网站设计模板合肥优化网站哪家公司好
  • 做网站的上海公司关于软文营销的案例
  • 网站用自己的电脑做服务器吗医院网站开发多少钱
  • 网站促销计算服务器租用一天
  • 东莞外贸网站建设哪家好网站首页设计公司
  • 环保设备网站建设方案蓝盟it外包
  • 手机网站建设 移商动力photoshop官方下载
  • 网站域名要钱吗哪些网站可以直接做英文字谜