案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?( 二 )
这里要确认下,doBuild() 是否只生成一个 stepWithRouter?如果这是正确的,那么我理解也许只需要头一个 step(first step)就可以创建整个 Flow,因为其他的后续 steps 通过第一个 step 的 router 可以间接地访问到,所以这里其实是 firstStepWithRouter。可是为什么 Flow 的源码中,用的又是 stepsWithRouter(复数)?单数与复数,含义不一样。3)遍历 map这个节点的画法好像是错误的。最后生成的 checkerForkFlowMapping 是一个新的 map?它有几个 elements,一个,还是多个?如果需要生成多个 result map 的 elements (checker-forkFlow pairs),那么应该参考我上面的画法,采用 loop 结构来遍历 source map 中的所有成员。类图
* 没看到 Checker* 缺少连线如 Flow 到 StepState第 3 版3)合并了SimpleRouter节点,但是该节点应该只有一个输入,不确定怎么表示第二种需要传入null的情况,故加了注释说明传入null,感觉不太准确。可以这样更准确地画:
可以添加一个节点 get null,再用一个 Merge 节点来连接 nextStepWithRouter 与 null 这两个参数,表示二选一作为 createSimpleRouter 的输入。。。。
■网友
因为在提问中修改问题字数超限,所以在这里新创建了一个回答。 设计类图如下: 【案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?】
为了更加清晰的描述流程构建过程,画了三个活动图,由整体到局部。见下图:
图一表示创建FlowBuilder的实例,然后调用build方法,执行完毕返回Flow对象。第二个action其实是另一个activity,描述的是build方法执行过程。见下图:
这里拷贝steps是为了不影响最初的steps。第二个action表示创建stepWithRouter的过程,调用了另外的activity(见图三),随后用stepWithRouter创建Flow。
这个图就比较复杂了,有描述不清楚的地方,欢迎指出。 为什么要这么费力的去构造stepsWithRouter呢?因为stepsWithRouter包含流程运行需要的全部信息,贴上Flow的实现代码。public class Flow implements IFlow { //元组的第一个元素可能是IStep或IFlow接口的实现,故用Object类型 private Tuple2\u0026lt;Object, IRouter\u0026gt; stepsWithRouter; public Flow(Tuple2\u0026lt;Object, IRouter\u0026gt; stepsWithRouter){ this.stepsWithRouter = stepsWithRouter; } @Override public StepState run(Map\u0026lt;String, Object\u0026gt; context) throws Exception { IStep step = (IStep) stepsWithRouter.getFirst(); IRouter router = stepsWithRouter.getSecond(); StepState stepState = step.run(context); return router.route(context, stepState); }}
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 湖北通报扫黑除恶专项斗争典型案例办理情况
- 冬季煤气中毒案例多广东发出风险提醒
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?