在UML类图中,常见的6种关系:
在这里插入图片描述

  1. Generalization(泛化、继承)
  2. Realization(实现)
  3. Association(关联)
  4. Aggregation( 聚合)
  5. Composition(组合)
  6. Dependency(依赖)

一、6种关系

1.1、Generalization(泛化、继承)

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

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

img

1.2、Realization(实现)

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

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

img

1.3、Dependency(依赖)

【依赖关系】:是一种 使用 的关系。

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

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

img

1.4、Association(关联)

【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法。如:老师与学生,丈夫与妻子。

关联可以是双向的,也可以是单向的。

【代码体现】:成员变量

【箭头及指向】:有3种。双向箭头、单向箭头 和 不带箭头的 实线

  • 双向的关联,可以有两个箭头,也可以没有箭头的实线;

  • 单向的关联,有一个箭头的实线,指向被拥有者。

img

上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。

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

img

上图为自身关联:

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图,比较形象地展示了各种类图关系:
img
根据UML,尝试读图各个类图之前的关系,如果无法读图,说明没有掌握牢本页的知识。

三、箭头和指向的总结

在这里插入图片描述

  1. Generalization(泛化、继承): 实线三角箭头,箭头指向父类。
  2. Realization(实现) : 虚线三角箭头 ,箭头指向接口。
  3. Dependency(依赖): 虚线箭头,指向被使用者。
  4. Association(关联) : 带普通箭头或不带箭头的 实线 ,指向被拥有者。
  5. Aggregation( 聚合) : 实线 的 空心菱形 ,菱形指向整体 。
  6. Composition(组合): 实线 的 实心菱形 ,菱形指向整体 。

四、聚合与组合的区别

4.1、相同点

  • 聚合关系:是整体与部分的关系,是关联关系的一种,是 强的关联关系
  • 组合关系:是整体与部分的关系,是关联关系的一种,是 比聚合关系还要强的关系 ,在组合中,部分与整体生命期一致,部分与组合同时创建并同时消亡。

4.2、不同点

聚合

聚合关系 像是 车 和 轮胎 的关系。轮胎离开车,也能生存,是一个独立体。

再比如,很多大雁聚在一起变成雁群,也可以说雁群里有雁,所以是整体和个体之间的关系,即 has-a 的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期。即雁群可以不存在了,但是孤雁仍然存在。

public class 雁群{
	private 大雁[] 大雁数组名
}

组合

一只鸟由两个翅膀组合而成,它体现的是 contains-a 关系,这种关系比聚合更强,也称为强聚合。他同样体现的是整体与部分间的关系,但此时整体和部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。比如这 只鸟死了,自然这两个翅膀也不存在了。

public class{

	private 翅膀 wing;
	
	public(){
	    wing = new 翅膀();
	}
}

这两种关系对比着就很好理解。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐