UML 统一建模语言

1. UML是什么

UML,统一建模语言,是被广泛认可的图形化建模标准,它可以帮助开发人员在面向对象设计(OOAD)过程中标识元素、构建模块、分析过程,并可以通过文档来注明系统中的重要细节。

2. UML的适用领域

UM适用于系统开发过程中从需求规格描述到系统完成后测试的不同阶段。

  • 需求分析。用例图描写叙述需求,用类图描写叙述静态结构,采用顺序图、合作图、活动图、状态图描述动态行为
  • 设计。采用类图、包,对类的接口进行设计
  • 编码。将类用某现象对象语言实现
  • 测试。按类图、测试用例图对软件进行测试
  • 部署。按照部署图进行部署

3. UML中的四种主要关系

  1. 关联关系(Association)
  2. 依赖关系(Dependency)
  3. 泛化(一般化)关系(Generalization)
    泛化指的是类之间的继承关系
  4. 聚集关系(Aggregation)
    聚集指的是整体与部分之间的关系,在实体域对象之间很常见

4. UML中的两类九种图

静态模型图:描述系统的结构

1、 类图;2、对象图;3、组件图;4、部署图

动态模型图:描述系统的行为
1、用例图;2、活动图;3、时序图;4、协作图;5、状态图
在这里插入图片描述

4.1. 用例图

用例图是从软件需求分析到最终实现的第一步,它是从客户的角度来描述系统功能,让不懂技术细节的客户能够直观的理解系统的功能。

所谓用例,就是系统的一个功能,如下例所示,该用例图显示了该系统有两个参与者(客户、管理员)和三个用例(登录、查询、修改)。用例图中的箭线则是参与者与用例之间的关系,下图中的关系表示了:客户可以使用登录和程序用例,管理员可以使用登录、程序和修改用例。
在这里插入图片描述

一张用例图通常包含三个基本组件:

  1. 参与者(Actor)
    与系统打交道的人或其他系统即使用该系统的人或事物。在UML中参与者用人形图标表示
  2. 用例(Use Case)
    代表系统的某项完整的功能。在UML中使用一个椭圆来表示
  3. 关系
    定义用例之间的关系。在UML中使用各种不同样式的线条来表示。虽然关系有三种不同的类型(包含关系 Include,扩展关系 Extend,泛化关系 Generalization),但它们的共性都是从现有的用例中抽取出共同的信息,组成一个可重用的单独用例。

4.1.1. 用例与用例之间的关系

4.1.1.1 包含关系

将一组跨越多个用例的相似功能包含用例进行封装,以便多个基用例进行复用。包含关系可以用编程时的函数调用来类比。在UML中包含关系用虚线箭头加“<<include>>",箭头指向被包含的用例。

如下图所示,该用例图中的“查询”、“登录”用例都涉及查询数据库,因此封装一个“数据库查询操作”用例供“查询”和“登录”两个用例包含;“修改”、“删除”用例都涉及修改数据库,因此封装一个“数据库修改操作”用例供“修改”和“删除”用例包含
在这里插入图片描述

4.1.1.2. 扩展关系

将基用例中一段相对独立的非必需功能扩展用例进行封装,从而使基用例行为更简练和流程更集中。扩展用例为基用例添加新的行为。在UML中扩展关系用虚线箭头加"<<extend>>",箭头指向被扩展的用例。

如下图所示,该用例图中“查询”用例是基本用例,而“打印”和“导出”用例是相对独立的非必需功能,也即,客户在查询时可以选择打印和导出,也可以不选择打印和导出。因此我们将“打印”和“导出”用例视为“查询”用例的扩展用例
在这里插入图片描述

4.1.1.3. 泛化关系(继承关系)

泛化关系可以类比面向对象语言中的类继承来理解。即子用例和父用例相似,但表现出更特别的行为,子用例将继承父用例的所有结构、行为和关系,可以使用父用例的一段行为,也可以重写它。在UML中,泛化关系用一个实线空心三角箭头从子用例指向父用例。

如下图所示,参与者“管理员”可以使用“客户注册审批”用例和“客户注销审批”用例,这两个用例都可以由一个父用例泛化而来,因此将“客户注册审批”用例、“客户注销审批”用例与“审批”用例之间的关系称作泛化关系
在这里插入图片描述

4.1.2. 用例规约

所谓用例规约,就是用例的使用文档,可以当做测试用例或者用作用户说明书,通常用一个表格来展示

一个典型的用例规约结构如下表所示

XXX系统XXX功能用例规约
用例名称
参与者
简单描述
前置条件
主要事件流参与者动作系统的响应结果
次要事件流触发的动作系统的响应结果
后置条件

主要事件流描述的是实现功能的过程中,参与者和系统之间的交互过程;系统响应结果讲的是最终展示给用户的结果,而不是处理数据的细节。

次要事件流起源于主事件流某个步骤,矫正后,又会回到主事件流的某个步骤

例如,后台管理系统用户登录功能用例规约

后台管理系统用户登录功能用例规约
用例名称用户登录
参与者系统所有用户
简单描述系统用户输入账号等信息,系统验证用户身份
前置条件该用户已经注册
主要事件流1、系统用户点击“登录”按钮
2、系统随机生成一个验证码,显示“登录表单”页面
3、系统用户在表单中填写数据:账号,密码,验证码,勾选记住我,提交
4、系统检查验证码是否正确,系统检查账号是否存在和检查密码是否一致,账号存在并且密码正确,显示登录成功
次要事件流4A、第4步,检查到验证码不一致
4A1、系统发现验证码不一致,重新显示“登录表单”页面,原来填写的账号等数据需要显示,显示错误信息“验证码不一致”
4A2、处理流程重回主事件流3
4B、在事件流第4步中:账号不存在,密码正确;账号存在,密码错误;账号不存在且密码错误
4B1、 系统发现上述问题,重新显示“登录表单”页面,原来填写的账号等数据需要显示,显示错误信息“账号不存在或者密码错误”
4B2、处理流程重回主事件流3
后置条件系统暂时保存用户身份信息

4.2. 类图

类图是面向对象系统建模中最常用的图,是定义其他图的基础,主要是用来显示系统中的类、接口以及它们之间的关系。

其包含的主要元素有类、接口和关系(关联关系、泛化关系、依赖关系、实现关系)。在类图中也可以包含注释和约束。

4.2.1. 类图的图符

图符名称描述
在这里插入图片描述三栏从上往下依次用来表示类的名称、属性和操作
在这里插入图片描述在这里插入图片描述接口接口表示对类操作的抽象(两种表示形式含义一致)
在这里插入图片描述包用来表示一个类图的集合
在这里插入图片描述对象对象表示类的一个实例
在这里插入图片描述关联关联用于表示类之间的联系,其特殊形式有:组成关联和聚集关联
在这里插入图片描述组成关联组成关联表示类之间是整体与部分的关系,且整体与部分共存亡
在这里插入图片描述聚集关联聚集关联表示类之间是整体与部分的关系
在这里插入图片描述链接链接用于表示类之间关联关系的一个实例
在这里插入图片描述泛化关系泛化关系(继承关系)用来表示一般元素与抽象元素之间的分类关系
在这里插入图片描述依赖关系依赖关系用来说明一个类或包的变化会引起依赖其的类或包的变化
在这里插入图片描述注释体注释体用于对UML实体进行文字说明
在这里插入图片描述注释链接注释链接用于链接注释体和其注释的UML实体

4.2.2. 类的表示

类是类图的主要组件,由“类名”、“属性”和“方法”组成,用三联矩阵表示

数据类型

符号表示
+public
-private
#protected
~package(可以理解为静态类型)

如下例所示类图:
在这里插入图片描述
用Java代码可以实现为:

package com.test.test;

public class Person {
	public int id;
	protected String name;
	private int age;
	static String address;
	 
	public String getName(int id) {return null;}
	 
	public void show() {}
	
}

4.2.3. 类与类之间的关系

4.2.3.1. 泛化关系(继承关系)

在UML中,泛化关系用来表示类与类接口与接口之间的继承关系。在UML中泛化关系用一条实线空心箭头由子类指向父类。

例如下面类图所示,“猴子”类和“老虎”类继承于“动物”类,也可以说“动物”类是“猴子”类和“老虎”类的父类
在这里插入图片描述

4.2.3.2. 实现关系

在UML中,实现关系用来表示类与接口之间的实现关系,用一条虛线空心箭头由子类指向父类。

例如下面类图所示,“UserDaoImpl”类实现了“UserDao”接口
在这里插入图片描述

4.2.3.3. 依赖关系

如果一个实体的改动会导致另一个实体也发生改变,则称两个类之间存在依赖。依赖指的是类与类之间的调用关系,表现为成员变量方法的参数或者对静态方法的调用。员工使用电脑进行工作。在UML;中用带虚线的箭头表示。

例如下面类图所示,“飞机”类依赖“引擎”类,当“引擎”类发生改变时飞机类也会发生改变,用现实生活中的话来说,就是引擎的属性以及工作状态会影响飞机飞行的属性和工作状态。
在这里插入图片描述

4.2.3.4. 关联关系

关联关系是一种拥有关系,它使一个类知道另一个类的属性和方法,例如老师与学生、学校与学生关联。通过成员变量体现。

用带普通箭头的实心线,指向被拥有者。单向的关联有一个箭头,双向的关联可以有两个箭头或者没有箭头。

例如下面类图所示,学校与学生是一对多的关系,因此关联关系从学校指向学生;老师与学生是多对多的关系,因此关联关系是双向的。
在这里插入图片描述

关联关系的多重性
关联关系的多重性是指有多少对象可以参与该关联,多重性可以用来表达一个取值范围、特定值或无限定的范围。

表示法作用
0表示0个对象
0…1表示0或1个对象
0…n表示0到n个对象
1…n表示1到n个对象
1表示1个对象
n表示n个对象
*表示许多个对象

例如下面的类图,表示许多个老师与许多个学生相关联
在这里插入图片描述

4.2.3.5. 聚合关系

聚合关系是关联关系的一种,关联和聚合在语法上一致,只通过具体的逻辑关系进行区分。

聚合关系是整体与部分的关系,且部分可以离开整体而单独存在。在UML图中用带空心菱形的实心线,菱形指向整体。

例如下面的类图中,“电脑”类和“磁盘”类是整体和部分的关系,“磁盘”类离开“电脑”类仍然可以存在(移动硬盘)。
在这里插入图片描述

4.2.3.6. 组合关系

是整体与部分的关系,但部分不能离开整体而单独存在。组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象生命周期。在UML图中用带实心菱形的实线,菱形指向整体

例如下面的类图中,“公司”类和“部门”是整体和部分的关系,没有“公司”类就不存在“部门”类。
在这里插入图片描述

4.2.4. 类图的正向工程和逆向工程

正向工程:根据类图类生成Java代码。通常先分析、设计、产生UML图,再根据UML图编写Java代码。

逆向工程:在已有Java代码的情况下,根据Java代码来生成相应的类图。

绘制类图可以在软件设计阶段帮助开发者从静态的角度去理解系统应该包含哪些类,以及类之间关系。实际上,很少把类图画得详细到可以通过正向工程来直接生成Java代码。绘制类图时,通常只会把那些最关键的属性和方法描述出来。

4.3. 对象图

对象图是类图的一个实例,用于显示系统执行时的一个快照,即在某一个时间点上系统的状态。对象图用带下划线的对象名称来表示对象。

例如下面的图中,“本田汽车:汽车”对象就是“汽车”类的一个实例
在这里插入图片描述

4.4. 组件图

组件图提供系统的物理视图(静态实现)。它的用途是显示系统中的软件其他软件组件(例如库函数)的依赖关系

对于现代的大型应用程序而言,通常不只是单独一个类或单独一组类所能完成的,通常会由一个或多个可部署的组件组成。

例如,对Java程序而言,可复用的组件通常打包成一个JAR、WAR等文件;对C/C++应用而言,可复用的组件通常是一个函数库,或者一个DLL (动态链接库)文件。

系统中各组件通过功能组织在一起,用组件图来建立系统中各组件之间的关系、设计系统的整体构架,通常在一个非常高的层次上显示。

例如下面的组件图表示了,“计算机”组件依赖于“CPU”、“硬盘”和“内存”三个组件
在这里插入图片描述
下面的业务流程组件图反映了,“控制层”组件依赖于“业务逻辑层”组件完成操作,而“业务逻辑层”组件又依赖于“持久化层”组件完成操作
在这里插入图片描述

4.5. 部署图

部署图用于描述软件系统如何部署硬件环境中,也就是体系结构的静态实施。它的用途是显示软件系统不同的组件将在何处物理地运行,以及它们彼此之间如何通信。

因为部署图是对物理运行情况进行建模,所以系统的生产人员就可以很好地利用这种图来安装、部署软件系统。

部署图中的符号包括组件图中所使用的符号元素,另外还增加了几个符号,主要是增加了节点的概念

节点:指组件运行的环境。可以是软件(操作系统、其他等)或硬件资源(计算机,其他硬件),也就是说一个节点应该包涵了一定的计算能力、内存资源和相对位置。
通信关联:节点通过通信关联建立彼此的关系,采用从节点到节点绘制实线来表示关联。

例如下面的部署图,表示了应用软件应该部署的位置(应用服务器)、数据库应该部署的位置(数据库服务器),并且三个节点通过网络相连接
在这里插入图片描述
下图是一个更复杂一些的部署图,它表示了,“学生终端”、“教师终端”、“管理员终端”三个节点可以通过局域网与“Tomcat服务器”中的两个组件系统交互,而“Tomcat服务器”的数据又存储在“数据库服务器”中。
在这里插入图片描述

4.6. 包图

包图由包和包之间的关系组成。包的图标就如同一个带标签的文件夹,它提供了一 种用于组织各种元素的分组机制,UML职工包与类的关系可以参考Java中package与class的关系。

在UML中,包用来对元素进行分组,并为这些元素提供命名空间,包所拥有的或者引用的所有元素称为包的内容,包没有实例。

例如下面的包图,表示了业务处理流程的不同类在不同包中,例如“userAction”和“AdminAction”两个类属于Action包,并且“UserAction”类依赖于“Service”包中的“UserService”类进行处理
在这里插入图片描述

4.7. 时序图

用于描述对象之间消息传递(方法调用)时间顺序,是显示类之间交互(与具体对象无关)的图,这些类按调用的时间顺序排列,因此也可以清晰地显示并发进程。概括一下就是:时序图显示的是参与交互的类之间消息交互的顺序。

4.7.1. 时序图的建模元素

  • 对象(Actor)
    时序图中对象使用矩形表示,对象名称带下划线。将对象置于时序图的顶部说明在交互开始时对象就已经存在了。如果对象的位置不在顶部,表示对象是在交互的过程中被创建的。
  • 生命线(LifeLine)
    生命线是一条垂直的虚线,表示时序图中的对象在一段生命周期内的存在。每个对象底部中心的位置都有生命线。
  • 控制焦点(Focus of Control)
  • 消息(Message)
    两个对象之间从发送方指向接收方的单路通信。在时序图中很少使用返回消息(返回消息使用虚线表示)。

在这里插入图片描述

4.8. 协作图(通信图)

协作图是一种交互图。与时序图不同,协作图表达对象间的交互过程及对象间的组织结构,而时序图主要侧重于对象间消息传递在时间上的先后关系

时序图与协作图都表示对象之间的交互作用,只是它们的侧重点有所不同:

  • 时序图描述了交互过程中的时间顺序,但没有明确地表达对象之间的关系。
  • 协作图描述了对象之间的关系,但时间顺序必须从顺序号获得。

时序图和协作图的语义是等价的,可以相互转换,而不丢失任何信息。

一个协作图样例如下所示,只需按照箭头顺序看协作图即可了解工作流程
在这里插入图片描述

4.9. 活动图

活动图本质上就是流程图,它用于描述系统的活动,判定点和分支等。流程图在生活中很常见,例如做PPT的时候常常会用到流程图。

活动图中的菱形框是判断标志,表示条件转移。活动图对表示并发很有用。在活动图中使用一个称为同步条的水平粗线可以将一条转移分为多个并发执行的分支,或将多个分支合为一条转移。此时,只有输入的转移全部有效才能执行后面的活动。

4.9.1. 活动图的图符

图符名称描述
在这里插入图片描述起点在一个活动图中表示所有活动的起点(有且仅有一个)
在这里插入图片描述终点在一个活动图中表示活动的终点(至少有一个)
在这里插入图片描述活动表示活动图中的一个具体的不可再分的活动
在这里插入图片描述组合活动表示活动图中的一个可再分的活动(一般用另一张活动图描述)
在这里插入图片描述对象若与信号流相连,表示它是与活动图中的对象进行交互(收发信号)的其他对象;若与数据流相连,表示它是活动的输入或输出
在这里插入图片描述泳道用于对活动图中的活动进行分组(类似包),同一组活动由一个或多个对象负责完成。
在这里插入图片描述条件判断表示活动流程中的判断,通常有多个信息流从它引出,表示判断后的不同活动分支
在这里插入图片描述同步条表示活动之间的同步。一般有一个或多个信息流向它引入和从它引出,表示引入的信息流同时到达,引出的信息流被同时触发
在这里插入图片描述信号发送表示在某个活动转移发生时向某个对象发送一个信号,等价于信息流上的发送子句
在这里插入图片描述信号接收表示信号的接收,是某个活动转移的必要条件。等价于信息流上的事件标识.

一个简单的流程图示例,该图中有两个泳道“客户端”和“系统”,客户端需要完成“输入登录数据”活动,其他活动由系统完成。
在这里插入图片描述

4.10. 状态图

状态图是通过建立对象的生存周期模型来描述对象随时间变化动态行为

4.10.1. 状态图的图符

图符名称描述
在这里插入图片描述初态状态图的起始点
在这里插入图片描述中间状态表示对象的一种状态
在这里插入图片描述复合状态表示对象的复合状态,可化为多个子状态,用"或"和"与"两种关系相连
在这里插入图片描述终态状态图的终点
在这里插入图片描述条件判断表示对象不同状态的条件分支转移

例如下面的状态图,一个空对象通过new指令由初态转变为临时状态,然后通过save()指令进入持久化状态,在通过close()指令转变为游离状态,最后通过finish()指令进入终态,结束生命周期。
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页