正文
4.2. 类图
类图是面向对象系统建模中最常用的图,是定义其他图的基础,主要是用来显示系统中的类、接口以及它们之间的关系。
其包含的主要元素有类、接口和关系(关联关系、泛化关系、依赖关系、实现关系)。在类图中也可以包含注释和约束。
4.2.1. 类图的图符
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()指令进入终态,结束生命周期。