文章目录
在UML类图中,常见的6种关系:
- Generalization(泛化、继承)
- Realization(实现)
- Association(关联)
- Aggregation( 聚合)
- Composition(组合)
- Dependency(依赖)
一、6种关系
1.1、Generalization(泛化、继承)
【泛化关系】:是一种继承关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种。
【箭头指向】: 实线
的 三角箭头
,箭头指向父类。
1.2、Realization(实现)
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。
【箭头指向】: 虚线
的 三角箭头
,箭头指向接口。
1.3、Dependency(依赖)
【依赖关系】:是一种 使用 的关系。
【代码表现】:局部变量、方法的参数或者对静态方法的调用。
【箭头及指向】: 虚线
的 箭头
,指向被使用者。
1.4、Association(关联)
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法。如:老师与学生,丈夫与妻子。
关联可以是双向的,也可以是单向的。
【代码体现】:成员变量
【箭头及指向】:有3种。双向箭头、单向箭头 和 不带箭头的 实线
。
-
双向的关联,可以有两个箭头,也可以没有箭头的实线; ↔ 、—
-
单向的关联,有一个箭头的实线,指向被拥有者。 →
上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。
但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。
上图为自身关联:
1.5、Aggregation( 聚合)
【聚合关系】:是整体与部分的关系,可理解为 独立的生命(或事物)聚合在一起。比如说 雁群 与 大雁,停机坪与飞机、武林盟主与各路的英雄。
特点: 部分对象的生命周期并不由整体对象来管理。也就是说,当整体对象已经不存在的时候,部分的对象还是可能继续存在的。 可以理解为 如果 树死猢狲散,但是猢狲没死,只是另寻其它的大树。
举列:
比如,有坏人开枪把雁群打散了,但是大雁还在; 停机坪被毁环了, 但飞机还在,可以停到其它地方。
再比如,天下英雄 聚集在 某某大王的麾下,如果 此大王 被杀,这些英雄 就要另寻 其他名主。
总结: 聚合的关系,可以理解为 树倒猢狲散,但是猢狲没死,再寻其它的大树, 就是聚合关系。
【代码体现】:成员变量
【箭头及指向】: 实线
的 空心菱形
,菱形指向整体 。
public class Address {
...
}
public class Person {
private Address address;
public Person(Address address) {
this.address = address;
}
}
我们通常通过如下的方式来使用Person对象:
Address address = new Address();
Person person = new Person(address);
或者:
Person person = new Person( new Address() );
1.6、Composition(组合)
【组合关系】:也是整体与部分的关系, 生命(或事物)与其组成部分的关系,
是 比聚合关系还要强的关系,在组合中,部分与整体生命期一致,部分与组合同时创建并同时消亡 。
示例:
- 比如,
大红花
公司 与 其部门的关系,当大红花
公司不存在时,大红花
公司下的部门自然也就不存在了。 - 大雁 与 翅膀 , 翅膀 是 大雁 生命的组成部分, 大雁 不存在时,它的翅膀就也不存在了,“皮之不存,毛将焉附” 就是指这个组合关系。
- 汽车和引擎,,引擎 是汽车的一个组成部分,没有引擎就不是汽车,当汽车不存在时,引擎没有存在的意义。
总结: 组合的关系,可以理解为 “皮之不存,毛将焉附” ,它们就是组合关系。
【代码体现】:成员变量
【箭头及指向】: 实线
的 实心菱形
,菱形指向整体 。
public class Engine{
...
}
public class Car{
Engine e = new Engine();
...
}
Engine对象是在Car对象里面创建的,所以在Car对象生命周期结束的时候,Engine对象的生命周期也同样结束了。
组合 与 聚合 的区别
- 组合关系, 可以理解为,生命(或事物)本身的一部分,“皮之不存,毛将焉附” ,它们就是组合关系。
比如: 鸟与翅膀,汽车与引擎。 - 聚合关系 ,两个独立生命(或事物)的聚合在一起, 树倒猢狲散,但是猢狲没死,再寻其它的大树, 就是聚合关系。
比如 停车场与汽车,雁群与大雁、武林盟主与各路的英雄。
二、6种关系的顺序:
各种关系的强弱顺序:
泛化= 实现> 组合> 聚合> 关联> 依赖
下面这张UML图,比较形象地展示了各种类图关系:
根据UML,尝试读图各个类图之前的关系,如果无法读图,说明没有掌握牢本页的知识。
三、箭头和指向的总结
- Generalization(泛化、继承):
实线
的三角箭头
,箭头指向父类。 - Realization(实现) :
虚线
的三角箭头
,箭头指向接口。 - Dependency(依赖):
虚线
的箭头
,指向被使用者。 - Association(关联) : 带普通箭头或不带箭头的
实线
,指向被拥有者。 - Aggregation( 聚合) : 实线 的
空心菱形
,菱形指向整体 。 - Composition(组合): 实线 的
实心菱形
,菱形指向整体 。
四、聚合与组合的区别
4.1、相同点
- 聚合关系:是整体与部分的关系,是关联关系的一种,是 强的关联关系;
- 组合关系:是整体与部分的关系,是关联关系的一种,是 比聚合关系还要强的关系 ,在组合中,部分与整体生命期一致,部分与组合同时创建并同时消亡。
4.2、不同点
聚合
聚合关系 像是 车 和 轮胎 的关系。轮胎离开车,也能生存,是一个独立体。
再比如,很多大雁聚在一起变成雁群,也可以说雁群里有雁,所以是整体和个体之间的关系,即 has-a
的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期。即雁群可以不存在了,但是孤雁仍然存在。
public class 雁群{
private 大雁[] 大雁数组名
}
组合
一只鸟由两个翅膀组合而成,它体现的是 contains-a
关系,这种关系比聚合更强,也称为强聚合。他同样体现的是整体与部分间的关系,但此时整体和部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。比如这 只鸟死了,自然这两个翅膀也不存在了。
public class 鸟{
private 翅膀 wing;
public 鸟(){
wing = new 翅膀();
}
}
这两种关系对比着就很好理解。