UML 类图中类之间的关系详解

类与类之间的关系主要有六种:泛化实现组合聚合关联依赖

从一个示例开始

请看下面这张类图,类之间的关系是我们需要关注的:

类图

  • 车的类图结构为<<abstract>>,表示车是一个抽象类。
  • 它有两个继承类:小汽车和自行车;它们之间的关系为 实现关系,使用带空心箭头的虚线表示。
  • 小汽车与SUV之间也是继承关系,它们之间的关系为 泛化关系,使用带空心箭头的实线表示。
  • 小汽车与发动机之间是 组合关系,使用带实心箭头的实线表示。
  • 学生与班级之间是 聚合关系,使用带空心箭头的实线表示。
  • 学生与身份证之间为 关联关系,使用一根实线表示。
  • 学生上学需要用到自行车,与自行车是一种 依赖关系,使用带箭头的虚线表示。

示例解释说明

类的继承关系表现在 UML 中为:泛化实现

泛化关系在最终代码中表现为 继承非抽象类

小汽车在现实中有实现,可用小汽车定义具体的对象;小汽车与 SUV 之间为泛化关系。

实现关系在最终代码中表现为 继承抽象类

“车”是一个抽象概念,在现实中并无法直接用来定义对象,只有指明具体的子类(汽车还是自行车),才可以用来定义对象(“车”这个类在 C++ 中用抽象类表示,在 JAVA 中有接口这个概念,更容易理解)。

注:接口是抽象类的变体,接口中所有方法都是抽象的,没有一个有方法体。

聚合关系表示整体与部分的关系,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在。

例如,一个部门由多个员工组成;部门撤销了,人员不会消失,他们依然存在。

组合关系表示整体与部分的关系,是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也将不存在。

例如,公司由多个部门组成;公司不存在了,部门也将不存在。

关联关系描述不同类的对象之间的联系,是一种 最常用强关联 的关系,在最终代码中 关联对象通常是以成员变量的形式实现的

例如,乘车人和车票之间就是一种关联关系,学生和学校就是一种关联关系。

注:在 UML 图中,单向关联或自关联有一个箭头,双向关联可以有两个箭头或者没有箭头。关联关系默认为双向的,不强调方向。

依赖关系描述一个对象在运行期间会用到另一个对象的关系。在最终代码中 依赖关系体现在某个类的方法使用了另一个类的对象作为参数

与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化,依赖关系也可能发生变化。依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *