UML类与类之间的关系
目录
- 一、简介
- 二、UML类关系
- 1、依赖关系
- 2、关联关系
- 3、聚合关系
- 4、组合关系
- 5、泛化关系
- 6、实现关系
- 三、总结
一、简介
类与类之间的关系有:
-
依赖(Dependency)
-
关联(Association)
-
聚合(Aggregation)
-
组合(Composition)
-
泛化(Generalization)
-
实现(Implement)
关系的强弱顺序:(由强到弱)
实现
= 泛化
> 组合
> 聚合
> 关联
> 依赖
关系越弱,耦合度越低,关于耦合度可以简单的理解为,当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强。
二、UML类关系
下面我们由弱到强的顺序来讲解UML类关系。
1、依赖关系
依赖关系,使用虚线加箭头
表示:
依赖关系
是类关系中 耦合最小
的一种关系,类A要完成某个功能引用了类B,则类A依赖类B。
依赖在代码中主要体现为类A的 某个成员函数返回值
、方法参数
、局部变量
或 静态方法的调用
,则表示类A引用了类B。
以 Student
类和 Computer
类为例,示例代码如下:
public class Computer{
public void start(){
}
}
public class Student{
public void playGame(Computer computer){
computer.start();
}
}
学生玩电脑游戏需要传入一个电脑对象,因此我们说Student类依赖Computer类。
2、关联关系
关联关系
指的是,一个类与另一个类之间有某种关联,这种关联关系可以使用HAS-A表示。
关联关系
如果进行详细的划分,又可进一步分为 单向关联
、双向关联
和自关联
。
单向关联
,使用实线加箭头
表示:
双向关联
就是双方各自持有对方类型的成员变量,使用不带箭头的实线
表示:
自身关联
,使用不带箭头的实线指向自身
表示:
关联暗示了依赖,二者都用来表示无法用聚合和组合表示的关系。
依赖关系
的 两个类都不会增加属性
。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。
发生关联关系的两个类,类A成为类B的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。 在代码中的表现如下:
public class Teacher{
}
public class Student{
public Teacher teacher;
}
从关系的生命周期来看:
-
依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束。
-
关联关系当类实例化的时候产生,当类对象销毁的时候关系结束。相比依赖,关联关系的生存期更长。
3、聚合关系
聚合关系
,使用空心菱形加实线
表示:
聚合关系
描述的是 整体和部分
的关系,是一种比较特殊的关联关系。
在聚合关系中,整体的生命周期,不会决定部分的生命周期,强调 “整体” 包含 “部分”,但是 “部分” 可以脱离 “整体” 而单独存在。
如图中班级和学生的关系就是整体和部分的关系。
4、组合关系
组合关系
,使用 实心菱形加实线
表示:
组合关系
也可以看作是一种 特殊的聚合关系
,是一种比聚合关系还要强的关系。
组合关系与聚合关系最大的不同在于: 组合关系这里的“部分”脱离了“整体”是无法存活的,部分就不复存在,整体的生命周期决定部分的生命周期,部分是依附在整体上面的,有时候也有人称为合成关系。
5、泛化关系
泛化关系
,就是指 类和类
、接口与接口
之间的继承关系
,就是一个类继承另一个类所有的描述,并且可以根据需要对父类进行拓展,是面向对象的重要特征之一。
泛化关系
,使用实线加三角形箭头
表示:
6、实现关系
实现关系
,主要针对接口和抽象类而言,实现接口和抽象类的类必须要实现他们的方法。
实现关系
,使用虚线加三角形箭头
表示:
三、总结
-
依赖关系
比较好区分,它是耦合度最弱的一种,在编码中表现为类成员函数的局部变量、方法参数、返回值或对静态方法的调用; -
关联
、聚合
与组合
在编码形式上都以类成员变量的形式
来表示,所以只给出一段代码我们很难判断出是关联、聚合还是组合关系,我们需要从上下文语境中来判别; -
关联关系
表示类之间存在联系,不存在集体与个体、个体与组成部分之间的关系; -
聚合关系
表示类之间存在集体与个体的关系; -
组合关系
表示个体与组成部分之间的关系; -
依赖
、关联
、聚合
与组合
是逻辑上的关联
,泛化
是物理上的关联
。物理上的关联指的是类体的耦合,所以类间耦合性最强。