参考链接:UML类图几种关系的总结

关系的类别

依赖 

【依赖关系】:是一种使用的关系,所以要尽量不使用双向的互相依赖。

【代码表现】:局部变量、方法的参数或者对静态方法的调用

【箭头及指向】:带箭头的虚线,指向被使用者

UML类图——类之间的关系_关联关系

关联

【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

【代码体现】:成员变量

【箭头及指向】:带普通箭头的实心线,指向被拥有者

UML类图——类之间的关系_生命周期_02

 注解:一个老师可以有n个学生,一个学生可以有m个老师。

 

 老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。

个人看法:上面是原作者的说法,个人觉得说的有些笼统。课程与学生之间是不是双向关联应该根据实际情况来定。比如,可以让老师拥有n个课程,而一个课程拥有n个学生)

聚合

【聚合关系】:是整体与部分的关系.如车和轮胎是整体和部分的关系。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。

【代码体现】:成员变量。一般使用set方法设置

【箭头及指向】:带空心菱形的实心线,菱形指向整体

UML类图——类之间的关系_生命周期_03

组合

【组合关系】:是整体与部分的关系.,没有公司就不存在部门 。组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期

【代码体现】:成员变量。一般通过构造函数设置。

【箭头及指向】:带实心菱形的实线,菱形指向整体

UML类图——类之间的关系_关联关系_04

泛化

【泛化关系】:是一种继承关系,它指定了子类如何特化父类的所有特征和行为例如:老虎是动物的一种.

【箭头指向】:带三角箭头的实线,箭头指向父类

UML类图——类之间的关系_类图_05

实现

【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现

【箭头指向】:带三角箭头的虚线,箭头指向接口

UML类图——类之间的关系_成员变量_06

 类图关系示例

UML类图——类之间的关系_成员变量_07

 关系的强弱顺序

依赖<关联<聚合<组合<泛化、实现

 

聚合和组合的区别

聚合的特性

聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。

 

组合的特性

组合(Composition) 关系也是关联关系的一种,是比聚合关系强的关联关系。它要求聚合关系中代表整体的对象负责代表部分对象的生命周期。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。

 

二者的区别

1、生命周期不同:比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象也同时消亡(没有任何一个引用指向它,成了垃圾对象),这种情况叫做组合,反之b所指向的对象还会有另外的引用指向它,这种情况叫聚合。

 

2、代码实现方式不同:

(1)组合方式一般会这样写:A类的构造方法里创建B类的对象。也就是说,当A类的一个对象产生时,B类的对象随之产生,当A类的这个对象消亡时,它所包含的B类的对象也随之消亡。

(2)聚合方式则是这样:A类的对象在创建时不会立即创建B类的对象,而是等待一个外界的对象传给它传给它的这个对象不是A类创建的。

 

3、举例:人和手、脚是组合关系,因为当人死亡后人的手也就不复存在了。汽车和汽车引擎、轮胎是聚合关系,汽车坏了引擎、轮胎可以回收利用。

 

参考链接

1、UML类图几种关系的总结

2、聚合和组合的区别