上两篇文章主要讲了《[实战项目:设计实现一个流程编排框架(分析)(https://mp.weixin.qq.com/s/veLQZJqYNKbYvuCi7Pf_nA)]》《实战项目:设计实现一个流程编排框架(设计》我们介绍了如何通过合理的分析,来实现需求的同时满足易用、易扩展、灵活、低延迟、高容错等非功能性需求。

针对编排框架的开发如何做高质量的代码实现。说的具体点就是,如何利用设计思想、原则、模式、编码规范、重构技巧等,写出易读、易扩展、易维护、灵活、简洁、可复用、易测试的代码。

流程注册

之前有讲到要支持yml、properties、xml、json、接口的形式注册流程模型,为了体现职责单一原则,我们需要把一种格式解析的逻辑独立处理,为了体现对扩展开发,对修改关闭原则,我们先定义一组接口,然后通过工厂模式提供对应的实现逻辑;这里工厂是使用者,通过接口调用具体的实现,实现在这里是提供者,又是一组策略模式

流程加载

流程加载我们需要知道其他的几个需求功能点:1、提供对外统一访问接口;2、提供执行记录和执行耗时;3、不同流程节点需要定义不同的解析器;4、通过工厂创建解析类型;5、流程节点按照顺序执行。

通过不同的节点类型执行不同的解析方式,显而易见这里需要用工厂模式去做解析类创建,而且需要做到对外扩展开发对修改关闭,新增节点不用动其他代码逻辑,只要在工厂函数里面添加一个节点解析器;同时我们这里定义一个Map集合用于在加载工厂函数的时候就把解析对象创建,而不用每次解析的时候再去创建解析器,减少不必要的内存

代码如下:

public class NodeComponentFactory {private final static Map<String,NodeParser> cacheParser = new HashMap<>();static {cacheParser.put(NodeParserEnum.method.name(),new MethodNodeComponent());cacheParser.put(NodeParserEnum.bean.name(),new BeanNodeComponent());cacheParser.put(NodeParserEnum.condition.name(),new ConditionNodeComponent());cacheParser.put(NodeParserEnum.service.name(),new ServiceNodeComponent());cacheParser.put(NodeParserEnum.subflow.name(),new SubFlowNodeComponent());}public static NodeParser getNodeInstance(String nodeName){return cacheParser.get(nodeName);}
}

当我们发现每一种节点解析类型都需要去实现parser接口,而且每个节点都有类似的步骤,那我们这里就要考虑用抽象工厂,也符合一个依赖倒置的的设计原则,上层模块通过依赖接口访问,下次模块继承抽象类,同时也用到了策略模式做接口调用;在实现的逻辑过程我们会发现很多步骤是重复的,比如初始化入参、执行记录,所有我们把重复的内容放到抽象类,通过模板模式的方式,让流程节点只关注解析层面;

public abstract class AbstractNodeComponent implements NodeParser{public Map<String, Node> nodeMap;/*** 初始化参数* @param inputUrl* @param baseInput* @return*/public BaseInput initInput(String inputUrl, BaseInput baseInput){BaseInput baseInputTarget = ClassUtil.newInstance(inputUrl, BaseInput.class);BeanUtils.copyProperties(baseInput,baseInputTarget);return baseInputTarget;}/*** 解析节点信息* @param node 节点信息* @param baseInput 请求参数* @param baseTemp 临时上下文* @return*/public BaseOutput parserNode(Node node, BaseInput baseInput, BaseTemp baseTemp){baseTemp.setFlowRecord(baseTemp.getFlowRecord().append(FlowConstants.NODEKEY+FlowConstants.NODE+FlowConstants.COLON+node.getId()));BaseOutput baseOutput = parser(node, baseInput, baseTemp);return baseOutput;};@Overridepublic void setNodeMap(Map<String, Node> nodeMap) {this.nodeMap = nodeMap;}@Overridepublic abstract BaseOutput parser(Node node, BaseInput baseInput, BaseTemp baseTemp);}

流程加载顺序

流程执行我们需要把组件分的很细,最好是独立实现一个功能的类划分成一个组件,体现职责单一原则,也只要把执行功能划分的很细,才能在流程执行的各个流程中灵活组合;在下面流程图中可以看到几个组件,第一个是流程统一执行的入口,这里会有两个地方会用到,第一个就是给外部调用的接口,第二个是子流程执行的入口;第二个组件是节点统一加载管理组件也就是上文提到的工厂类;第三个就是每个组件自己的解析器,用于实现不同类型节点的操作;在设计的过程中一定知道 流程 、管理、节点之间的边界,减少耦合,只有这样不同的组件才能灵活组成。

实战项目:设计实现一个流程编排框架(实现)相关推荐

  1. 实战项目:设计实现一个流程编排框架(设计)

    上一篇文章我们讲了<实战项目:设计实现一个流程编排框架(分析)>主要对流程编排框架产生的背景,并做了需求分析,这其中包含功能性需求和非功能性需求,算是在正式开始设计之前做一个铺垫. 前面提 ...

  2. 实战项目:设计实现一个流程编排框架(分析)

    最近几篇文章,我会带大家一起设计一个流程编排框架,从项目的分析.设计.实现.重构.测试方面去了解整个编排框架,也会用到一些设计开发原则及设计模式,话不多说,我们先来看下编排框架的一个背景. 背景 对于 ...

  3. 别再用硬编码写业务流程了,试试这款轻量级流程编排框架

    前言 在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取, ...

  4. 轻量级流程编排框架liteFlow

    前言 在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取, ...

  5. 关于商品详情页接口流程编排框架的一点实践

    商品详情页,其实就是查各种接口,然后集中对用户展示商品各种各类信息,最核心的就是商品信息,还包括关键信息诸如价格信息.优惠券.促销信息.配送信息,还有一些可有可无的内容,比如问答.评价等信息. 我们实 ...

  6. 手把手教你如何自己设计实现一个深度学习框架(附代码实现)

    作者丨王桂波@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/78713744 编辑丨极市平台 导读 本文首先从深度学习的流程开始分析,对神经网络中的关键组件抽象,确定 ...

  7. Kstry流程编排框架

    Kstry是什么? 所见( 图示模型 )即所得( 代码执行 )的可视化流程编排框架 可轻易将流程从串行升级到并行,支持任务拆分.任务重试.任务降级.子任务遍历.指定超时时间的并发框架 共享能力平台侧的 ...

  8. Vuex实战项目—ToDoList代码及流程详解

    ToDoList实战 一.安装依赖 二.全部代码 文件夹结构 三.流程步骤 1.列表数据的动态加载 2.文本输入框的双向同步 3.添加事项的操作 4.删除功能 5.复选框状态的绑定 6.修改复选框的是 ...

  9. batocera中文整合包_分享一个整合 SSM 框架的高并发和商品秒杀项目

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 ...

最新文章

  1. python怎么安装本地的egg_python egg怎么安装
  2. JavaScript编码encode和decode escape和unescape
  3. wireMock快速伪造restful服务
  4. java 栈 先进后出_数据结构: 先进后出——堆栈
  5. 『转载』看c#打印的各种技术
  6. 致敬ATSS | Dynamic ATSS再造ATSS辉煌!!!
  7. 重装win10遇到的坑
  8. (Mix) The task phx.new could not be found
  9. 北京龙庆峡自助游及攻略
  10. Android 模仿淘宝历史记录,记录存在手机内
  11. win10开机启动执行bat文件
  12. 布局AI+新药研发,深度智耀获红杉中国近1500万美元B轮融资
  13. 绕圈圈(python)
  14. 刘东明微信营销二十五式初探(一)
  15. getBytes()方法详解
  16. 数据结构进阶(Go语言)
  17. 蓝色基因 p超级计算机,世界最快超级计算机 蓝色基因登陆中国
  18. 【资源共享】eBook分享大集合
  19. 竞争性谈判和招标的区别是什么?
  20. BLDC电机控制算法——FOC简述

热门文章

  1. oracle快速删除1000万数据,怎么快速删除4000多万条重复的记录????
  2. 电视+私人影院+KTV+游戏厅,爽!
  3. 献给我曾经的偶像—特雷西·麦克格雷迪
  4. 【linux systemctl】Linux命令之systemctl命令
  5. decimal,float和double的区别是什么?
  6. Office文档在线编辑
  7. 02.docker镜像的区别--Alpine、Slim、Stretch、Buster、Jessie、Bullseye
  8. html手机偏左,判断方向盘跑偏有妙招 一部手机就搞定
  9. 大四实习两个月的体会
  10. 哲学视角说Docker:资本利润最大化的产物。