UML活动图绘制指南

UML活动图是一种用于表示软件系统执行流程的图,它和平时见到的流程图非常类似,但是实质上活动图与流程图并不是一种图,且比起流程图,UML活动图能够更加详细地表示一个软件系统或者某个软件功能的执行过程。

1,活动图的要素

在一个UML活动图中,通常有下列要素:

  • 起点 :使用一个实心圆表示,是整个流程的开始
  • 终点 :使用一个实心圆外加一个圆圈表示,是整个流程的结束
  • 活动 :使用圆角矩形表示,是流程中一个不可再分的步骤
  • 对象 :使用直角矩形表示,是步骤产生的中间变量或者对象,一个对象可以是一个活动的输入或者输出
  • 分支 :使用空心菱形表示,表示条件判断
  • 分叉/汇合 :使用实心粗线表示(小飞棍??),用于分叉出并行的多个流程,或者多个流程汇合得到结果
  • 活动流 :使用单向实线箭头表示,用于连接两个活动要素,表示两个活动的执行顺序
  • 对象流 :使用单向虚线箭头表示,用于连接对象和其他要素,表示对象的流动顺序

下面,我们就来通过一些常见的示例,学习一下怎么绘制UML活动图。

2,活动图的绘制

(1) 简单顺序结构

例如有下列简单代码:

java 复制代码
// 声明变量a为1
int a = 1;
// 控制台输出a
System.out.println(a);

上述代码是由两个简单的步骤构成的流程,我们表示如下图:

可见将每个步骤表示为一个活动即可,活动之间使用单向实线箭头连线表示它们的执行顺序。

上述我们将整个活动图竖着放、从上至下 的顺序,事实上横着放、从左至右也可以:

具体根据自己的排版来定。

(2) 活动与对象

当我们的某个步骤需要产生中间变量的时候,就可以使用对象要素来表示这个中间变量,中间变量可以作为一个活动的输入或者输出,例如下列代码:

java 复制代码
Scanner scanner = new Scanner(System.in);
// 输入a
int a = scanner.nextInt();
// 输入b
int b = scanner.nextInt();
// 输出a+b的值
System.out.println(a + b);

上述前两个步骤为输入,输入产生了变量ab,最后输出了a + b的值,我们作图表示如下:

可见我们使用矩形方框表示一个对象,并且对象流需要使用虚线单向箭头表示,即任何指向对象或者从对象发出的箭头都是虚线。

(3) 分支和循环

在软件开发中,无论是分支结构还是循环结构,通常都离不开条件,我们都可以使用UML活动图中的菱形来表示。

首先来看一个条件判断:

java 复制代码
Scanner scanner = new Scanner(System.in);
// 输入hp值
int hp = scanner.nextInt();
if (hp > 80) {
	// 大于80,输出生命值良好
	System.out.println("生命值良好");
} else {
	// 否则,输出生命值低
	System.out.println("生命值低");
}

作图表示如下:

通过菱形要素表示分支,并且我们通常需要把分支条件标记在从分支要素(菱形)延伸出去的箭头线上 ,使用方括号[]包围条件。

当然,分支要素事实上不仅仅能够表示这种简单的二元条件,对于多元条件判断也是可以的:

java 复制代码
Scanner scanner = new Scanner(System.in);
// 输入hp
int hp = scanner.nextInt();
if (hp > 80) {
	// 大于80时
	System.out.println("生命值良好");
} else if (hp > 50) {
	// 介于50与80之间
	System.out.println("生命值中等");
} else {
	// 小于等于50
	System.out.println("生命值低");
}

作图如下:

对于循环/迭代结构,事实上也可以使用分支要素与条件表达,例如:

java 复制代码
// 初始化i=0
for (int i = 0; i < 10; i++) {
	// 当i<10时,输出i的值
	// 每循环一次i自加1
	System.out.println(i);
}

我们作图如下:

此外,迭代元素也是类似的:

java 复制代码
// 初始化数组a
int[] a = {1, 2, 3};
// 迭代a的元素,每次迭代得到的变量为num
for (int num : a) {
	// 输出num的值
	System.out.println(num);
}

作图如下:

借助分支要素与条件,并结合正确的对象流或者活动流,我们也能够表示出循环和迭代结构。

(4) 并行与汇合

例如有的任务需要多线程执行,对于并行的多任务表示,我们可以使用分叉/汇合元素来表示一个并行分叉的开始或者结束,例如下面是一段使用两个线程并行读取数组中元素的一段程序,其中一个线程读取输出奇数下标,一个线程读取输出偶数下标:

java 复制代码
// 线程池
ExecutorService pool = Executors.newVirtualThreadPerTaskExecutor();
// 初始化数组a
int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 创建两个线程读取数组a
// 线程1选取奇数下标的元素并输出
Future<?> future1 = pool.submit(() -> {
	for (int i = 1; i < a.length; i += 2) {
		System.out.println("线程1:" + a[i]);
	}
});
// 线程2选取偶数下标的元素并输出
Future<?> future2 = pool.submit(() -> {
	for (int i = 0; i < a.length; i += 2) {
		System.out.println("线程2:" + a[i]);
	}
});
// 等待两个线程执行完成
future1.get();
future2.get();

作图表示如下:

使用分叉/汇合元素(黑色粗线)可以表示多个并行流程开始分叉出去的点,也可以表示多个并行流程结束汇合到一起的点。

3,Draw.io绘制活动图

Draw.io是一个开源的绘图软件,它包括了非常多的图案模板,我们可以使用它绘制各种各样的图,包括类图、活动图等等。

该软件可以直接在线使用,也可以下载客户端:

在之前的UML类图绘制教程中,已经讲解了如何使用Draw.io软件,这里就不再详细讲解了,主要提示一下一些需要注意的地方。

在左侧栏通用分类中,我们可以找到表示活动和对象的矩形:

其余活动图相关图形,我们在左侧栏UML 2.5这个分类中可以找到:

需要注意的是,默认情况下不会显示UML 2.5这个分类,点击左侧下方 + 更多图形按钮调出来即可:

示例仓库地址:传送门

相关推荐
梁辰兴5 天前
UML 建模实验
软件工程·uml·建模
思忖小下9 天前
梳理你的思路(从OOP到架构设计)_UML应用:业务内涵的分析抽象&表达03
uml
思忖小下9 天前
梳理你的思路(从OOP到架构设计)_UML应用:业务内涵的分析抽象&表达01
uml·ooa
肖老师+11 天前
可视化建模与UML《部署图实验报告》
uml·可视化建模
思忖小下14 天前
开发中使用UML的流程总结篇
需求分析·uml
战神刘玉栋14 天前
《知识拓展 · 统一建模语言UML》
软考·uml·面向对象
喵~来学编程啦14 天前
【软件工程】一篇入门UML建模图(状态图、活动图、构件图、部署图)
软件工程·uml
喵~来学编程啦14 天前
【软件工程】一篇入门UML建模图(用例图、对象图、顺序图与协作图)
软件工程·uml
肖老师+17 天前
可视化建模以及UML期末复习篇----UML图
uml·可视化建模
沉河不浮18 天前
PlantUML——类图
uml