UML类图再谈
前面介绍的用例图和活动图,都是为了捕获用户的需求。
需求明白了之后,就要开始设计。
而类图,就是用来进行软件设计的一种图。类图是一种静态图。
1 类图的定义与面向对象
1.1 类class
类的具有相同属性、操作、方法、关系或者行为的一组对象的描述符。
类是真实世界事物的抽象。
1.2 对象object
类的实例,被称为对象。
同一个类的各个对象具有:
- 相同的属性,但属性的取值可以不同
- 提供相同的操作、有相同的语义
综上,把类相关的元素画在一起,即为类图。
1.3 面向对象设计要解决的问题
在设计一个较为复杂的软件系统时,往往需要进行建模,是使用类图建模时,需要考虑:
- 这个系统有多少个类?
- 每个类需要定义多少个属性?
- 每个类需要定义多少个操作/方法?
- 类与类之间的关系是怎样的?
- 类之间的信息交互、如何完成复杂功能的?
2 UML中类图的元素介绍
2.1 类的表示
类的图形表示可由4个部分组成:
- 名称
- 属性
- 操作/方法

此外,在类的图形最下面,还可以再加一个职责的描述,用来对这个类的功能进行说明。
在显示时,只有名称是必须的,其余部分可以隐藏,不展示。
2.2 类之间的关系
2.2.1 继承/泛化(实线+空心三角箭头)
继承,也可称作泛化,表示一般与具体的关系。

2.2.2 实现(虚线+空心三角箭头)
类与接口的关系。

2.2.3 依赖(虚线+箭头)
某个类的功能依赖另一个类

2.2.4 关联(实线/实线+菱形)
关联的修饰,包括名称、角色、多重性、聚合/组合,后面小节具体介绍

2.3 类元素的命名
2.3.1 类
类名的每一个词的首字母大写,如:Student
2.3.2 属性
属性名除第一个词之外的每个词的首字母大写,如:stdNumber
2.3.3 操作/方法
操作名除第一个词之外的每个词的首字母大写,如:selectCourse();
3 关联关系的修饰
3.1 名称及其方向
- 名称:即描述关联的词,如老师教(teaches)课程
- 方向:用箭头表示关系的指向,比如在下图中,可以在teaches右边补充一个向右的箭头,表示是左边的老师讲授右边课程

3.2 角色
角色,就是关联中对象扮演的角色,比如公司扮演雇主,人扮演雇员。

3.3 多重性
指定在任何时间点关系中可以涉及的对象数。
无默认多重性 如果未明确说明多重性,则为未定。
| 装饰 | 语义 |
|---|---|
| 0..1 | 0个或1个 |
| 1 | 1个 |
| 0..* | 0个或无数个 |
| 1..* | 1个或无数个 |
| 1..3,7..10 | 1个到3个,7个到10个 |
| * | 0个或无数个 |
来看下面这个例子:

从图中可以看出:
- 一个公司有7个雇员,1个人可以被一个公司雇佣。
- 一个银行账户对应一个拥有者;一个银行账户又可以有多个操作者。
- 一个人可以有0到多个银行账户;一个人又可以操作0到多个银行账户。
3.4 聚合/组合
聚合和组合,都是表示部分与整体之间的关系。
- 聚合:"整体"有管理“部分”的特有的职责,例如,学校和学生
- 组合:“整体”拥有“部分”的生命,例如,手机和屏幕

3.5 关联类
关联类,是一种特殊的类,既能当关联使用,又有类的特点。
例如,公司与个人这两个类,仅靠普通关联可能无法描述清楚其关系,这个时候就可以使用关联类,它能定义关系的属性、操作等等。

4 类图实例
4.1 实例一
如下图:
- 电视机依赖插座
- 发电厂实现插座的供电功能
- 屏幕是电视机的一部分,是组合关系
- 火力发电厂是发电厂的一种,是泛化关系
- 发电厂由发电设备,工厂工人等来维持正常运作,是聚合关系

4.2 实例二
如下图:
- 学校里有学生,是聚合关系,并且学校可以有1个至多个,对应的学生可以有任意个
- 学校里有各个部分,是组合关系,一个学校可以有多个部门/学院
- 学生可以选课,1个学生可以选多个课程,1个课程也可以被多个学生选
- 1个部门/学院可以开设多个课程
- 1个课程可以由多个教师来讲授
- 1个部门/学院可以多个教师,是聚合关系

5 总结
本篇介绍了UML中的类图,主要包括类图的各种元素,类之前的各种关系等等。





