工作流设计器之数据模型


第 4 章 数据模型

现在我们开始进入Gef的核心模型,这也是Gef用于为上层应用提供支撑的基础架构。虽然它仅仅是依赖于传统的MVC三层结构,但是因为一些命名上的区别,我们需要谨慎对待,避免搞混其中的关系。

在Gef中的MVC模型。Model数据模型层还是叫Model。View视图层叫做Figure。Control控制器曾叫做EditPart。

警告

等文档完成第一次复审之后,要将MVC的介绍与各组件之间的关系单独作为一章进行介绍。而不是放在Model章中作为前言介绍。

MVC的Model部分,主要负责保存数据,其他组件以ModelChangeListener的形式注册到Model中,当Model中的数据发生改变时会触发特定的事件,提醒ModelChangeListener进行处理。

Model部分应该提供各种数据修改接口,外围应用对模型的修改都要通过接口,不能跳过接口直接修改模型中的数据,这样才能保证在对应接口修改完数据之后触发对应的事件通知监听器进行处理。保证MVC三层的状态同步。

提示

目前就有很多操作绕过了接口,直接修改了Model中的数据,这与当前设计不足,接口提供的功能不充分有关。

4.1. 基本模型

最基本的模型结构包含Model和对应的ModelChangeListener。

0104-01.png

基本模型和监听器

图 4.1. 基本模型和监听器


每个Model可以对应多个ModelChangedListener,Model中以队列的形式保存这些监听器,在触发事件时遍历所有的监听器,并调用每个监听器的notify()方法。

4.2. 节点和连接模型

GEF中最常用的两种模型:节点和连接。两者都继承于Model。


模型继承0104-02.png

图 4.2. 模型继承


Gef将所有图形设计都抽象成点与线的关联,通过对点与线的各种组合实现不同的图形设计功能。

节点支持parent与children的树形结构,连接则包含source与target用于确定连接的起点和终点。

0104-03.png

节点与连接的关联关系

图 4.3. 节点与连接的关联关系


每个NodeModel包含两个数组:incomingConnections和outgoingConnections。incomingConnections中保存所有进入该节点的连接。outgoingConnections中保存所有离开该节点的连接。

与之对应,ConnectionModel包含两个属性:source和target。source对应该链接的起始节点,target对应该链接的终止节点。

4.3. 模型事件

NodeModel和ConnectionModel中分别定义了对应的模型变更事件。


表 4.1. NodeModel提供的事件

名称描述
CHILD_ADDED从工具条拖拽出新节点时,将新增的节点添加到顶级节点中,向对应的上级节点中添加新节点。
NODE_MOVED拖拽改变节点位置。
NODE_RESIZED拖拽改变节点的大小。
TEXT_UPDATED编辑节点名称。
CHILD_REMOVED_FROM_PARENT删除节点。
CONNECTION_SOURCE_ADDED将连线与起始节点连接。
CONNECTION_TARGET_ADDED将连线与终止节点连接。



表 4.2. ConnectionModel提供的事件

名称描述
RECONNECTED连线与起始和结束节点连接。
DISCONNECTED连线与起始和结束节点断开连接。
CONNECTION_RESIZED拖拽将连线修改为折线。
CONNECTION_TEXT_UPDATED编辑连线的名称。
TEXT_POSITION_UPDATED拖拽修改连线名称的位置。
SOURCE_CHANGED起点发生改变。
TARGET_CHANGED终点发生改变。


4.4. 通过dom维护数据

为了维护模型中的数据,每个Model内部都会包含一个Dom类,这个Dom类代表了模型导入导出时对应的XML片段。每个Dom包含多个attributes和elements,除了一些经常用到的关键数据,节点名称,节点位置,之外,其他与业务数据相关的信息都会保存在Dom中。

引入Dom的用意,除了让数据与节点模型剥离之外,Dom中还可以完整保留XML中手工定义的冗余数据,例如当前某些配置项还不能被流程设计器所支持,虽然这些数据不能显示在流程设计器的画布中,也无法通过流程设计器的属性编辑页面进行修改,但是Dom可以保证这些手工定义的冗余数据不会在导入导出的过程中遗失,它可以完整的将导入数据以XML原来的格式进行保存,在使用流程设计器对数据模型进行维护时,也不会对这些冗余数据造成损伤。

提示

目前Dom还不能维护XML中的注释,如果导入XML中存在注释,这些注释内容会被自动删除。


上一篇 下一篇

评论



分享