图接口分为：图（用于运行，不可修改） 和 图定义（用于定义和修改，然后创建新图）。示例：

```java
//创建图
Graph graph = Graph.create("demo1", spec -> {
    //开始定义
    spec.addStart("start").linkAdd("n1");
    spec.addActivity("n1").task(new Draft()).linkAdd("n2");
    spec.addActivity("n2").task(new Review()).linkAdd("n3");
    spec.addActivity("n3").task(new Confirm()).linkAdd("end");
    spec.addEnd("end");
});

//复制，并修改为新图
Graph graphNew = Graph.copy(graph, spec -> {
    //修改定义
    spec.removeNode("n3"); //移除节点n3
    spec.getNode("n2").linkRemove("n3").linkAdd("end"); //移除 n2->n3 的连接，并添加 n2->end 连接
});

//执行
flowEngine.eval(graphNew);
```


### 1、Graph （图）主要方法

| 方法         | 描述          | 备注         |
| -------- | -------- | -------- |
| `+ create(id, (GraphSpec spec)->{}) : Graph`            | 创建图     |       |
| `+ create(id, title, (GraphSpec spec)->{}) : Graph`     | 创建图     |       |
| `+ copy(graph, (GraphSpec spec)->{}) : Graph`     | 复制图，并修改定义     |       |
| `+ fromUri(url) : Graph`                              | 通过配置文件加载图     |       |
| `+ fromText(text) : Graph`                           | 通过配置文本加载图     |       |
| | | |
| `toYaml() : String`                           | 转为 yaml     |       |
| `toJson() : String`                            | 转为 json        |       |
| `toPlantuml() : String`                       | 转为 PlantUML （状态图）文本。v3.9.5 后支持        |       |
| `toMap : Map<String, Object>`          | 转为 map（方便其它序列化方式）     |       |
| | | |
| `getId() : String`                                    | 获取id     |       |
| `getTitle() : String`                                 | 获取显示标题     |       |
| `getDriver() : String`                               | 获取驱动配置     |       |
| `getMetas() : Map<String, Object>`          | 获取所有元数据      |  只读     |
| `getMeta(key) : Object`                           | 获取元数据     |       |
| `getMetaAs(key) : T`                               | 获取元数据（泛型）     |       |
| `getMetaOrDefault(key, def) : T`               | 获取元数据或默认（泛型）     |       |
| | | |
| `getLinks() : List<Link>`                                    |  获取所有连接     |   只读    |
| | | |
| `getStart() : Node`                                    |  获取开始节点        |       |
| `getNodes() : Map<String, Node>`                                  |  获取所有节点        |  只读     |
| `getNode(id) : Node`                                 | 获取节点               |       |
| `getNodeOrThrow(id) : Node`                     |  获取节点或异常     |       |



### 2、GraphSpec （图定义接口）主要方法

可以通过 `Graph.create("g1", spec->{  })` 产生。也可以通过 `new GraphSpec("g1")` 生产。


| 方法         | 描述          | 备注         |
| -------- | -------- | -------- |
| `+ GraphSpec(id) : GraphSpec`            | 构造图定义     |       |
| `+ GraphSpec(id, title) : GraphSpec`     | 构造图定义     |       |
| `+ GraphSpec(id, title, driver) : GraphSpec`     | 构造图定义     |       |
| | | |
| `+ fromUri(text) : GraphSpec`     | 通过配置文件加载图定义     |       |
| `+ fromText(text) : GraphSpec`     | 通过配置文本加载图定义     |       |
| | | |
| `then((GraphSpec spec)->{}) : Graph`     | 然后（修改定义）     |       |
| `create() : Graph`                              | 生成图     |       |
| | | |
| `toYaml() : String`              | 转为 yaml     |       |
| `toJson() : String`              | 转为 json        |       |
| `toMap : Map<String, Object>`          | 转为 map（方便其它序列化方式）     |       |
| | | |
| `getId() : String`                                    | 获取id     |       |
| `getTitle() : String`                                 | 获取显示标题     |       |
| `getDriver() : String`                               | 获取驱动配置     |       |
| `getMetas() : Map<String, Object>`          | 获取所有元数据      |  只读     |
| `getMeta(key) : Object`                           |  获取元数据     |       |
| `getMetaAs(key) : T`                               |  获取元数据（泛型）     |       |
| `getMetaOrDefault(key, def) : T`               |  获取元数据或默认（泛型）     |       |
| | | |
| `getNodes() : Map<String, NodeSpec>`               |  获取所有节点定义        |  只读     |
| `getNode(id) : NodeSpec`                                  |  获取节点定义        |       |
| `removeNode(id) : NodeSpec`                            |  移除节点定义        |       |
| `addNode(nodeSpec) : NodeSpec`                      |  添加节点定义        |       |
| | | |
| `addStart(id) : NodeSpec`                                  |  添加开始节点定义        |        |
| `addEnd(id) : NodeSpec`                                   |  添加结束节点定义        |        |
| `addActivity(id) : NodeSpec`                              |  添加活动节点定义        |        |
| `addInclusive(id) : NodeSpec`                             |  添加包容节点定义        |        |
| `addExclusive(id) : NodeSpec`                            |  添加排他节点定义        |        |
| `addParallel(id) : NodeSpec`                               |  添加并行节点定义        |        |
| `addLoop(id) : NodeSpec`                                  |  添加循环节点定义        |        |



