2.2.2 类图
类图是最古老、功能最丰富、使用最广泛的UML
图。类图表示系统中应该包含哪些实体,各实体之间如何关联;换句话说,类图显示了系统的静态结构,类图可用于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种类。
类图的图形表示
类在类图上使用包含三个部分的矩形来描述:
- 最上面的部分显示类的名称,
- 中间部分包含类的属性,
- 最下面的部分包含类的方法。
图2.11显示了类图中类的表示方法。
类图除可以表示实体的静态内部结构之外,还可以表示实体之间的相互关系。
类之间的三种基本关系
类之间有三种基本关系:
- 关联(包括聚合、组合)
- 泛化(与继承同一个概念)
- 依赖
1. 关联
客观世界中的两个实体之间总是存在千丝万缕的关系,当把这两个实体抽象到软件系统中时,两个类之间必然存在关联关系。
单向关联
关联具有一定的方向性:如果仅能从一个类单方向地访问另一个类,则被称为单向关联;
双向关联
如果两个类可以互相访问对象,则被称为双向关联。
多重性
一个对象能访问关联对象的数目被称为多重性,例如,建立学生和老师之间的单向关联,则可以从学生访问老师,但从老师不能访问学生。
关联图形表示
关联使用一条实线来表示,带箭头的实线表示单向关联。
关联和属性的区别
在很多时候,关联和属性很像,关联和属性的关键区别在于:类里的某个属性引用到另外一个实体时,则变成了关联。
聚合 组合
关联关系包括两种特例:聚合和组合,它们都有部分和整体的关系,组合比聚合更加严格。
当某个实体聚合成另一个实体时,该实体还可以同时是另一个实体的部分。
- 例如,学生既可以是篮球俱乐部的成员,也可以是书法俱乐部的成员;
当某个实体组合成另一个实体时,该实体则不能同时是另一个实体的部分。
聚合使用带空心菱形框的实线表示,
组合则使用带实心菱形框的实线表示。
实例
图2.12显示了几个类之间的关联关系。
图2.12中描述Teacher
和Student
之间的关联关系:它们是双向关联关系,而且使用了多重性来表示Teacher
和Student
之间存在1:N的关联关系(1..*
表示可以是一个到多个),即一个Teacher
实体可以有1个或多个关联的Student
实体;
Student
和BasketBallClub
存在聚合关系,即1个或多个Student
实体可以聚合成一个BasketBallClub
实体;
而Arm
(手臂)和Student
之间存在组合关系,2个Arm
实体组合成一个Student
实体。
2. 泛化
泛化与继承是同一个概念,都是指子类是一种特殊的父类,类与类之间的继承关系是非常普遍的。
继承关系
继承关系使用**带空心三角形的实线
**表示。图2.13显示了Student
和Person
类之间的继承关系
从图2.13可以看出,Student
是Person
的子类,即Student
类是种特殊的Person
类。
实现关系
还有一种与继承类似的关系,类实现接口可视为一种特殊的继承,这种实现用**带空心三角形的虚线
**表示
3. 依赖
如果一个类的改动会导致另一个类的改动,则称两个类之间存在依赖。依赖关系使用带箭头的虚线表示,其中箭头指向被依赖的实体。依赖的常见可能原因如下:
- 改动的类将消息发给另一个类。
- 改动的类以另一个类作为数据部分。
- 改动的类以另一个类作为操作参数。
通常而言,依赖是单向的,尤其是当数据表现和数据模型分开设计时,数据表现依赖于数据模型。例如,JDK
基础类库中的JTable
和DefaultAbleModel
,关于这两个类的介绍请参考本书12.11节的介绍。图2.14显示了它们之间的依赖关系:
对于图2.14中表述的JTable
和DefaultTableModel
两个类,其中DefaultTableModel
是JTable
的数据模型,当DefaultTableModel
发生改变时,JTable
将相应地发生改变。