图19 反向过程向导所生成的类图
7.绘制工具
除了绘制标准的 UML 类图之外,很多时候在图上加入一些自由绘制的形状标注,或者多边形,或者任意位置的提示文字,会更便于阅读和使用一些。MyEclipse UML 包含了一组画图工具,可以用来画一些简单的形状或者是加入文字,这些内容可以放入任意类型的 UML 图中。 绘图工具位于 UML 编辑器的工具栏上, 并且可以通过下拉的方式选择需要绘制的形状,如图 17.22 左侧图所示。当选中了一种图形后,工具栏上的按钮就可以保持此形状的选中状态,便于以后重复画图。图 17.22 右侧图展示了绘制结果
图20 绘制工具栏下拉菜单及绘制的图形
绘图工具支持的类型有:Rectangle - 矩形;RRect ― 圆角矩形;Circle - 环形; Line - 直线; Text - 带框的文本; Polygon ― 多边形;Spline - 拟合曲线;Ink - 墨水印。线型和颜色,以及文字的颜色和字体等属性,都可以在 Properties 视图下的Presentation标签页中进行设置。
8.用例图(Use Case Diagram)
在类图之外,第二个经常用到的 UML 图,也许就是用例图了。用例图描述了系统提供的功能单元。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的\角色\(actors,也就是与系统交互的其他实体)关系,以及系统内用例之间的关系。用例图一般表示出用例的组织关系--要么是整个系统的全部用例,要么是完成具有功能的一组用例。要在用例图上显示某个用例,可绘制一个椭圆,然后将用例的名称放在椭圆的中心或椭圆下面的中间位置。 要在用例图上绘制一个角色 (表示一个系统用户) ,可绘制一个人形符号。角色和用例之间的关系使用简单的线段来描述,如图 21 所示。
图21 用例图
在这个图中,定义了两个角色:普通用户和管理员,还定义了 4 种用例:注册,登录,修改和删除。不管角色和用例,都是可以集成的,例如上图中删除这个用例继承自修改。集成的符号和类图中的一样,都是一个封闭的实线箭头。每个角色所能参与的用例,通过连接线进行关联。如图中所示的,普通用户只能注册和登录,而管理员则拥有更多的能力。
绘制用例图非常简单,点击工具栏上的 按钮可以创建一个新角色,点击 则创建一 个新的用例。 和类图编辑一样, 双击角色或者用例图, 可以快速输入它们的名称。 点击 这个按钮即可创建关联关系。其它的功能例如继承,扩展,包含等等,和类图都是一样的, 点击按钮后拖放连接即可形成相对关系。
一般来说,用例更多的是一种系统描述图,里面的角色和用例都是和具体类无关的,也 不能从它们生成代码,它们代表的是一组相关类的抽象。
9.活动图
活动图表示在处理某个活动时, 两个或者更多类对象之间的过程控制流。 活动图可用于在业务单元的级别上对更高级别的业务过程进行建模,或者对低级别的内部类操作进行建 模。就我个人的经验来说,一般用来绘制系统的流程图。
一个活动图中只能有一个起点和一个终点。 如图 22 所示, 展示了一个用户注册邮件确认的注册过程活动图。在图中,黑色的实心圆表示起点,而整个活动的结束点以实心圆环
表示。活动使用一个圆角矩形(活动的名称包含在内)来表示,例如: 输入用户名 , 确认注册 等等。菱形表示一个分支结构,常代表程序设计语言中的 if/else 这样的判断流程,例如 用户名有效性检查 这一活动即代表判断流程。 活动跳转使用带打开箭头的线段来表示。 另外, 活动图还支持用分叉和合并来表示并发的流程处理表示, 例如图中的输出提示信息和发送确认邮件,是两个并列进行的操作,并在 确认注册 处合并。最后流程从注册成功处转向结束。除此之外,活动图还支持对象流。活动图不但可以显示控制流,还可以显示对象取值的流,对象流的状态表达了对象是活动的输入还是输出。对于输入值,由对象流状态至活动的虚线来表示, 如果活动具有一个以上的输出值或后续的控制流, 则可以用分支和合并来进行。
图22 活动图
在 MyEclipse 中创建活动图比较容易,创建一个活动图。接着双击活动图在编辑器中打开,可以看到编辑器的工具栏出现和绘制活动图有关的图标。点击对应的图标即可创建节点,双击状态,或者连接线,可以编辑其名称或者提示文字。这些工具如表 5 所示。
表5 活动图编辑器工具栏
10.序列图(Sequence Diagram)
序列图显示具体用例(或者是用例的一部分)的详细流程。它几乎是自描述的,并且显示了流程中中不同对象之间的调用关系,同时还可以很详细地显示对不同对象的不同调用。序列图有两个维度:垂直维度以发生的时间顺序显示消息/调用的序列;水平维度显示消息被发送到的对象实例。一个序列图的例子如图 17.25 所示。
序列图的绘制非常简单。横跨图的顶部,每个框(参见图)表示每个类的实例(对象)。在框中,类实例名称和类名称之间用空格/冒号/空格来分隔,例如, 张三 : Male。如果某个类实例向另一个类实例发送一条消息, 则绘制一条具有指向接收类实例的开箭头的连线, 并把消息/方法的名称放在连线上面,例如 追求 (rose)。对于某些特别重要的消息,您可以绘制一条具有指向发起类实例的开箭头的虚线,将返回值标注在虚线上,例如 拒绝 :boolean。如果绘制出包括返回值的虚线,那么这些额外的信息可以使得序列图更易于阅读。阅读序列图也非常简单, 图 17.25 表示了一个张三追求小雯并间接和小雯妈产生联系的序列过程。从左上角启动序列的“驱动”类实例开始,然后顺着每条消息往下阅读。虽然图中所示的例子序列图显示了每条被发送消息的返回消息,但这只是可选的。另外,实例也可以自己调用自己,例如张三 高兴的唱歌 ()方法。
图23 序列图
相比较起来, 人们一般认为序列图表示的流程要比活动图精确些, 但是序列图的绘制显然要多画点时间。在 MyEclipse 中绘制序列图,首先创建一个序列图。 接着双击活动图在编辑器中打开, 可以看到编辑器的工具栏出现和绘制活动图有关的图标。绘制的顺序是先列出顶部的参与对象列表,例如张三,小雯,小雯妈,然后再绘制方法调用过程以及返回值。至于异步调用之类的不常用的内容,我们就不做过多介绍了。 这些工具如表6所示。
表6 活动图编辑器工具栏