简介
类图是使用频率最高的UML图之一,用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。
类的UML图示
在UML中,类使用包含类名、属性和操作且带有分隔线的长方形来表示。
如定义一个Person类, 有name、sex、age等属性,setName()、setSex()、getName()等方法,代码如下:
那么它对应的UML类图如下图所示:
为什么这样表示呢,像+,-,#代表什么意思呢?
在UML类图中,类一般由三部分组成:
- 类名:每个类都必须有一个名字,类名是一个字符串。
- 类的属性:属性是指类的性质,即类的成员变量。属性的表示方式为:
可见性 名称:类型 [ = 缺省值 ]
其中:
“可见性”:该属性对于类外的元素而言是否可见,包括公有(public)、私有(private)和受保护(protected)三种,在类图中分别用符号+、-和#表示。
“名称”:属性名,用一个字符串表示。
“类型”:属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。
“缺省值”:一个可选项,即属性的初始值。 - 类的方法: 操作的表示方式为:
可见性 名称(参数列表) [ : 返回类型]
其中:
“可见性”的定义与属性的可见性定义相同。
“名称”:方法名,用一个字符串表示。
“参数列表”:方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号“,”隔开。
“返回类型”:一个可选项,表示方法的返回值类型,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void)
类之间的关系
1. 关联关系
关联(Association)关系是类与类之间最常用的一种关系,通常表示包含关系, 如教室包含学生,学校包含教室等等。
UML类图中:用实线连接有关联关系的对象所对应的类,如果是单项关联,用带箭头的实线表示,由包含类指向被包含类。
如:
(1) 双向关联
默认情况下,关联是双向的。双向关联直接用实线连接即可。例如学校有很多老师, 老师也有所属的学校。如下图:
(2) 单向关联
类的关联关系也可以是单向的。单向关联用带箭头的实线表示。如下图:
(3) 自关联
可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。例如:一个二叉树结构的节点类(Node)的左右孩子也是节点Node类型的对象。如下图:
(4) 多重性关联
多重性关联表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。常见的多重性表示方式如下所示:
表示方式 | 多重性说明 |
---|---|
1..1 | 表示另一个类的一个对象只与该类的一个对象有关系 |
0..* | 表示另一个类的一个对象与该类的零个或多个对象有关系 |
1..* | 表示另一个类的一个对象与该类的一个或多个对象有关系 |
0..1 | 表示另一个类的一个对象没有或只与该类的一个对象有关系 |
m..n | 表示另一个类的一个对象与该类最少m,最多n个对象有关系 (m≤n) |
例如一个学校可以没有或有多个老师,但一个老师只属于一个学校,可以如下图表示:
(5) 聚合关系
聚合是关联关系的一种特例,也表示整体和部分的关系,在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。
在UML中,聚合关系用带空心菱形的直线表示。如人可能有宠物, 但是宠物脱离了人也可以独立存在。如图:
在代码中实现时,成员对象通常作为构造方法、Setter方法或业务方法的参数注入到整体对象中。
(6)组合关系
组合也是关联关系的一种特例, 也表示整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,这种关系比聚合更强,也称为强聚合。一旦整体对象不存在,成员对象也将不存在,整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。
在UML中,组合关系用带实心菱形的直线表示。如人有心脏, 但是人这个整体如果没了,心脏也就没有意义了,人和心脏是不可分割的。如图:
在代码实现时,通常在整体类的构造方法中直接实例化成员类。
2. 依赖关系
依赖关系是一种使用关系,表示一个事物使用另一个事物。
在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。如现在我们都用电脑工作,我们依赖电脑。如下图:
在代码中实现,通常在某个类的方法使用另一个类的对象作为参数。
3. 泛化关系
泛化关系也就是继承关系,用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。
在UML中,泛化关系用带空心三角形的直线来表示。如人是基类,男人和女人都是派生类。如图:
在代码实现时,我们使用继承机制来实现泛化关系。
4. 实现关系
接口和类之间还存在一种实现关系,在这种关系中,类实现了接口,类中的操作实现了接口中所声明的操作。
在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。如我们常用的设置按钮的点击事件, 其实就是实现了OnClickListener, 是一种实现关系。如图:
总结
对于泛化、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的几种关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的。
但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。
参考
https://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html
https://blog.csdn.net/column/details/umlmodelingtechnolog.html