java - 构建有向循环图的流畅界面?

标签 java design-patterns builder fluent-interface directed-graph

我已经创建了一组类来表示用于表示 BPM 流程的有向循环图,基于 JUNGDirectedSparseGraph类,它仅提供基本的图形操作方法来添加和查找顶点和边。

我面临的挑战是创建一个 builder提供 fluent interface能够创建包含复杂分支、循环和多个端节点的图形(请参见下面的示例)。

平行分支

Parallel Branches

合并分支

Merging Branches

周期

Cycle

复杂

Complex

我当前的实现(参见下面的示例)正在对发生 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();

最佳答案

问题是构建器是一个方法链,而你想构建一个带有循环的图。您需要回溯,为此有必要明确(使用它们的标签)或隐含地引用先前的节点,例如:

    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();

您可以使用树结构来构建图表:

    SubGraph.node("id", "label")
        .to("edgeName1", SubGraph.node("A").to("", SubGraph.node("C"))),
        .to("edgeName2", SubGraph.node("B"));

但这只会延迟问题,因为当循环开始起作用时,您将再次需要明确地引用节点。缺少某种 GUI 或广泛的 ASCII 绘图,无法定义没有别名的图形。

我个人会推荐 DOT 风格的解析器:

parse("a -> b -> c -> f -> e; f -> d -> b"); // "Cyclic graph"

更易于阅读和输入。

编辑:对于 lulz:没有别名的循环图:

    // do not ever do this:
    GraphBuilder.parseASCII(
            "     -->C--      \n" +         
            "    |      v     \n" +
            "A-->B      F-->E \n" + 
            "    |      ^     \n" +
            "     -->D--      \n");

关于java - 构建有向循环图的流畅界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28902461/

相关文章:

java - 从 getDeclaredMethods 中查找具有实际类型的泛型方法

java - 链接多个MapReduce作业时,每个作业的输出是否写入HDFS?

design-patterns - 在reactjs中组件组合中使用props的惯用方法是什么

c# - 使用 NEST 构建静态查询

用于联系人导入器的 Javascript Builder 模式与选项对象

java - 即使精度超过可用数字,格式也不打印所有两位数

java - 通过子类包限定符导入父类的内部接口(interface)

状态机的 C++ 代码

c# - 我应该在创建任何实例之前调用 static init()

java - 父类中的构造函数父级不能应用于给定类型错误