3.3.4 类之间的关系

3.3.4 类之间的关系

类之间的关系主要包括6种: 依赖关系、关联关系、聚合关系、组合关系、泛化关系、实现关系。

1.依赖关系

依赖(Dependency) 关系是一种使用关系, 是对象之间耦合度最弱的一种关联方式,是临时性的关联。在代码中, 某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类) 中的某些方法来完成一些职责。

在 UML 类图中, 依赖关系使用带箭头的虚线来表示, 箭头从使用类指向被依赖的类。图3-12 所示是依赖关系的实例, 这张人与手机的关系图表示人通过手机的语音传送方式打电话。

图3-12 依赖关系的实例

2.关联关系

关联(Association) 关系是对象之间的一种引用关系, 用于表示一类对象与另一类对象之间的联系, 如老师和学生、师傅和徒弟、丈夫和妻子等。关联关系是类与类之间最常用的一种关系, 分为一般关联关系、聚合关系和组合关系。我们先介绍一般关联关系。

关联可以是双向的, 也可以是单向的。在 UML 类图中, 双向的关联可以用带两个箭头或者没有箭头的实线来表示, 单向的关联用带一个箭头的实线来表示, 箭头从使用类指向被关联的类。也可以在关联线的两端标注角色名, 代表两种不同的角色。

在代码中通常将一类对象作为另一类成员变量来实现关联关系。图3-13所示是关联关系的实例, 这个老师和学生的关系图表示每个老师可以教多个学生, 每个学生也可跟着多个老师学习, 他们是双向关联的关系。

图3-13 关联关系的实例

3.聚合关系

聚合(Aggregation) 关系是关联关系的一种, 是强关联关系, 是整体和部分之间的关系, 是has-a 关系。

聚合关系也是通过成员对象来实现的, 其中成员对象是整体对象的一部分, 但是成员对象可以脱离整体对象而独立存在。例如, 学校与老师的关系, 学校包含老师, 但如果学校停办了, 老师依然存在。

在 UML 类图中, 聚合关系可以用带空心菱形的实线来表示, 菱形指向整体。图3-14所示是聚合关系的实例, 这是大学和教师的关系图。

图3-14 聚合关系的实例

4.组合关系

组合(Composition) 关系也是关联关系的一种, 也表示类之间整体与部分的关系, 但它是一种更强烈的聚合关系, 是contains-a 关系。

在组合关系中, 整体对象可以控制部分对象的生命周期, 一旦整体对象不存在, 部分对象也将不存在, 即部分对象不能脱离整体对象而存在。例如, 头和嘴的关系, 没有了头, 嘴也就不存在了。

在 UML 类图中, 组合关系用带实心菱形的实线来表示, 菱形指向整体。图3-15所示的是组合关系的实例, 这是头和嘴的关系图。

图3-15 组合关系的实例

5.泛化关系

泛化(Generalization) 关系是对象之间耦合度最大的一种关系, 表示一般与特殊的关系, 是父类与子类之间的关系, 是一种继承关系, 是 is-a 关系。

在 UML 类图中, 泛化关系用带空心三角箭头的实线来表示, 箭头从子类指向父类。在代码实现时, 使用面向对象的继承机制来实现泛化关系。例如, Student 类和 Teacher 类都是 Person 类的子类, 泛化关系的实例如图3-16所示。

图3-16 泛化关系的实例

6.实现关系

实现(Realization) 关系是接口与实现类之间的关系。在这种关系中, 类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。

在 UML 类图中, 实现关系使用带空心三角箭头的虚线来表示, 箭头从实现类指向接口。例如, 汽车和船实现了交通工具, 实现关系的实例如图3-17所示。

图3-17 实现关系的实例