izi*_*tti 6 java design-patterns fluent-interface directed-graph builder
我已经创建了一组类来表示用于表示BPM过程的有向循环图,它基于JUNG的DirectedSparseGraph类,它只提供基本的图形操作方法来添加和查找顶点和边.
我面临的挑战是创建一个构建器,它提供了一个流畅的界面,能够创建包含复杂分支,循环和多个终端节点的图形(参见下面的示例).
并行分支

合并分支机构

周期

复杂

我当前的实现(参见下面的示例)正在求助发生fork的顶点(例如,Parallel Branches中的顶点"B" ),然后在向该顶点添加新分支时引用别名.我的构建器还包括类似的东西,允许合并分支和循环.引入别名是因为顶点名称在BPM图中不是唯一的.我想要一个更优雅流畅的界面来快速构建图形,不受这些参考.
Graph graph = GraphBuilder.newGraph()
.addVertex("A")
.edgeName("")
.addVertex("B", "b-fork")
.edgeName("")
.addVertex("C")
.edgeName("")
.addVertex("E")
.addBranch("b-fork")
.edgeName("")
.addVertex("D")
.edgeName("")
.addVertex("F")
.build();
Run Code Online (Sandbox Code Playgroud)
问题是构建器是一系列方法,而您希望构建一个包含循环的图形.您需要回溯,并且要做到这一点,有必要明确地(使用他们的标签)或隐含地引用先前的节点,例如:
Graph graph = GraphBuilder.newGraph()
.addVertex("A")
.edgeName("")
.addVertex("B", "b-fork")
.edgeName("")
.addVertex("C")
.edgeName("")
.addVertex("E")
.goBack(2) // even worse than using label: breaks easily
.edgeName("")
.addVertex("D")
.edgeName("")
.addVertex("F")
.build();
Run Code Online (Sandbox Code Playgroud)
您可以使用树结构来构建图形:
SubGraph.node("id", "label")
.to("edgeName1", SubGraph.node("A").to("", SubGraph.node("C"))),
.to("edgeName2", SubGraph.node("B"));
Run Code Online (Sandbox Code Playgroud)
但这只会延迟问题,因为当循环发挥作用时,您将再次需要明确地引用节点.缺少某种GUI或大量的ASCII绘图,没有办法定义没有别名的图形.
我个人会推荐一个DOT风格的解析器:
parse("a -> b -> c -> f -> e; f -> d -> b"); // "Cyclic graph"
Run Code Online (Sandbox Code Playgroud)
这更容易阅读和打字.
编辑:对于没有别名的lulz:循环图:
// do not ever do this:
GraphBuilder.parseASCII(
" -->C-- \n" +
" | v \n" +
"A-->B F-->E \n" +
" | ^ \n" +
" -->D-- \n");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |