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

江苏省常州建设高等职业技术学校网站浏阳市住房和城乡建设局的网站

江苏省常州建设高等职业技术学校网站,浏阳市住房和城乡建设局的网站,九江专业网站建设,建筑工程施工合同范本一、背景 在项目中#xff0c;对于单据的扩展是基于类似于接口扩展实现的。从业务横行来看#xff0c;业务有A、B、C#xff1b;从纵向来看#xff0c;单个业务逻辑编排也可以划分为基础数据查询#xff0c;决策判断#xff0c;逻辑执行三大块。 单据扩展#xff1a;平…一、背景 在项目中对于单据的扩展是基于类似于接口扩展实现的。从业务横行来看业务有A、B、C从纵向来看单个业务逻辑编排也可以划分为基础数据查询决策判断逻辑执行三大块。 单据扩展平台构建单据基本信息不同业务往单据中构建不同的信息。 二、抽象 将业务玩法业务逻辑抽象可得策略模式和模版方法模式思维可将二者通过Spring的加载机制链接在一起共同实现代码的高内聚低耦合的特性。 三、线上运行版本 业务上下文 public class BusinessContext {private String type;private MapString , String features;}1、抽象业务逻辑编排并且定位为接口为策略模式提供基础 public interface BusinessStrategy {/*** desc: 查询节点查询决策节点所需的数据*/Object query(BusinessContext businessContext);/*** desc: 决策节点通过传入的业务上下文进行判断*/boolean isHandle(Object query);/*** desc: 业务逻辑具体执行节点*/void handle(BusinessContext businessContext ,Object query , MapString, String orderFeature);/*** desc: 策略管理类调用节点1*/default void execute(BusinessContext businessContext , MapString, String orderFeature) {Object query query(businessContext);boolean handleFlag isHandle(businessContext);if (handleFlag) {handle(businessContext, query , orderFeature);}}} 2、策略模式管理类和扩展入口 public class BusinessStrategyManager {Resourceprivate ListBusinessStrategy strategyList;public MapString, String doExecute(BusinessContext businessContext){MapString, String res new HashMap();for (BusinessStrategy businessStrategy : strategyList) {//循环调用不同的实现businessStrategy.execute(businessContext , res);if (MapUtils.isNotEmpty(res)) {break;}}return res;}} 3、A业务实现如果有其他实现followA实现即可不需要关心具体的bundle调用 public class BusinessStrategyAImpl implements BusinessStrategy {Overridepublic Object query(BusinessContext businessContext) {return 查询用来判断的数据;}/*** desc: 决策节点通过传入的业务上下文进行判断** param query*/Overridepublic boolean isHandle(Object query) {System.out.println(判断的数据进行判断);return true;}/*** desc: 业务逻辑具体执行节点** param businessContext* param query* param orderFeature*/Overridepublic void handle(BusinessContext businessContext, Object query, MapString, String orderFeature) {System.out.println(业务逻辑执行);orderFeature.put(A , BusinessStrategyAImpl);} } 四、运行版本中的问题 在策略模式管理类和扩展入口最初的运行版本对于businessStrategy.execute()方法的异常是自己捕获的并没有往外抛出导致了单据未补充正确的信息但是单据正常的创建了以至于后续链路全部异常。 从业务视角下看单据扩展信息补充发生异常时应当阻断单据创建。从扩展框架的视角上看实现类的异常应当直接抛出不能被框架消化否侧会导致使用者无法定位问题和发生预期之外的异常 五、复盘优化版本 该框架在线上运行过程中虽然无异常问题但是从代码层面来看依然具有优化的空间。 通用的策略框架适用于调用方法清楚的知道需要调用那个策略类调用方直接指定策略类但是在当前扩展中调用方也不知道具体调用策略类需要业务实现类中查询数据之后再进行判断对指定策略类的步骤进行了后置导致通用策略类框架不适用于当前情况。 问题详情 如果有n个实现类最差的情况需要把前面的n-1个实现类执行完成之后才会执行到第n个实现类。 前n-1个实现类中的基础数据查询阶段还不能出现异常例如超时异常否则都执行不到第n个实现类前n-1个实现类中基础数据查询到rpc调用耗时较久性能较低 优化思路 将基础数据查询中的通用部分例如orderA信息orderB在策略模式管理类和扩展入口中先查询再透传到链路中故不需要每一个实现类查询一次再通过实现类所需单据信息分为不同的组可最大限度的减少rpc调用可配置实现 六、优化框架 业务上下文 public class BusinessContext {private String type;private MapString , String features;}1、抽象业务逻辑编排并且定位为接口为策略模式提供基础 public interface BusinessStrategy2 {/*** desc: 决策节点*/boolean isHandle(BusinessContext businessContext);/*** desc: 业务逻辑具体执行节点*/void handle(BusinessContext businessContext, MapString, String orderFeature);/*** desc: 策略管理类调用节点2*/default void execute2(BusinessContext businessContext , Object query, MapString, String orderFeature) {boolean handleFlag isHandle(businessContext);if (handleFlag) {handle(businessContext, orderFeature);}}} 2、策略模式管理类和扩展入口 public class BusinessStrategyManager2 {Resourceprivate ListBusinessStrategy2 strategyList;private MapString, ListBusinessStrategy2 strategyMap new HashMap();//配置项配置业务实例和所需查询结果private MapString, String strategyGroupMap new HashMap() {{put(A, orderA);put(A1, orderA);put(A2, orderA);put(B, orderB);put(B1, orderB);put(B2, orderB);}};//配置项配置所需查询结果和查询对应的实例全类名private MapString, String queryGroupMap new HashMap() {{put(orderA, com.example.testproject.design.strategy.update.impl.QueryOrderAImpl);put(orderB, com.example.testproject.design.strategy.update.impl.QueryOrderBImpl);}};PostConstructpublic void buildStrategyMap() {//对业务实例根据所需查询结果进行分组for (BusinessStrategy2 strategy : strategyList) {if (strategyGroupMap.containsKey(strategy.getClass().getName())) {ListBusinessStrategy2 list strategyMap.get(strategyGroupMap.get(strategy.getClass().getName()));if (Objects.isNull(list)) {list new ArrayList();}list.add(strategy);strategyMap.put(strategyGroupMap.get(strategy.getClass().getName()), list);}}}public MapString, String doExecute(BusinessContext businessContext) {MapString, String res new HashMap();for (Map.EntryString, ListBusinessStrategy2 stringListEntry : strategyMap.entrySet()) {//不同所需查询结果的组获取不同的查询实例进行查询if (queryGroupMap.containsKey(stringListEntry.getKey())) {//获取配置的查询实例全类名String className queryGroupMap.get(stringListEntry.getKey());//获取实例QueryOrderInter queryOrderInter SpringUtils.getBean(className, QueryOrderInter.class);if (Objects.isNull(queryOrderInter)){throw new RuntimeException(未找到对应的查询实例className{} className);}Object query queryOrderInter.query(businessContext);ListBusinessStrategy2 value stringListEntry.getValue();//所需查询结果的相同的组对查询结果进行消费for (BusinessStrategy2 strategy : value) {strategy.execute2(businessContext, query, res);if (MapUtils.isNotEmpty(res)) {break;}}}}return res;}} 3、查询抽象接口 public interface QueryOrderInter {Object query(BusinessContext businessContext);}4、查询orderA public class QueryOrderAImpl implements QueryOrderInter {Overridepublic Object query(BusinessContext businessContext) {System.out.println(查询orderA);return orderA;} }
http://www.zqtcl.cn/news/404662/

相关文章:

  • 政务网站建设发言材料知名互联网公司有哪些
  • 网站搭建制作建e室内设计网画图
  • 重庆市建设工程施工安全管理信息网北京seo公司网站
  • 国外做调查问卷的网站建设邮费自己的网站 要不要购买服务器的
  • 网站建设和优化排名四川建设网官网证书查询入口
  • 如何搜名字搜到自己做的网站电子商务平台icp备案证明
  • 网站建设与管理工作内容北京网站建设价
  • 做网站选哪个语言软文营销的方法
  • 青岛正规公司网站建设公司中国建设银行注册网站
  • 免费个人网站平台关键词检索
  • 定制型网站建设推广宁河网站建设
  • 主流网站开发语言有哪些电子邮件营销
  • 扫描二维码进入公司网站怎样做在万网上域名了怎么做网站
  • 销售型网站设计怎么做网站广告位
  • 网站推广的方法ppt购物网站logo
  • 网站关键词分割wordpress为展示的作品投票
  • 建立网站 域名 服务器吗wordpress超链接出错
  • 外贸开发网站建设注册会计师协会
  • 莆田建设网站dw网页设计作品及源码
  • 360免费建站视频淘宝客的网站怎么做
  • 四川自助seo建站短视频推广计划
  • 网站建设案例的公司黄冈网站建设公司
  • 做淘客网站需要营业执照吗制作网站公
  • 手机网站开发的目的鲁班设计远程工作
  • 宿迁网站建设要多少钱高密市住房和城乡建设局网站
  • 咸阳网站建设公司哪家好wordpress访客ip记录
  • 厦门建设银行网站那个网站做效果图电脑配置
  • 人才网站建设医院网站建设的好处
  • 房屋装修网站模板html5做网站
  • 网站建设需要的硬件网站建设知名公司排名