ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 用于构建有向循环图的流畅接口?

2019-05-19 22:49:56  阅读:317  来源: 互联网

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


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

我面临的挑战是创建一个builder,它提供了一个能够创建包含复杂分支,循环和多个终端节点的图表的fluent interface(参见下面的示例).

并行分支

合并分支机构

周期

复杂

我当前的实现(参见下面的示例)正在求助发生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,design-patterns,builder,fluent-interface,directed-graph
来源: https://codeday.me/bug/20190519/1138037.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有