前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UML类图中常见的几种关系

UML类图中常见的几种关系

作者头像
joshua317
发布2022-09-19 15:44:56
6830
发布2022-09-19 15:44:56
举报
文章被收录于专栏:技术博文

本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/266

在UML类图中常见的几种关系: 泛化(继承)(Generalization):表示的是类之间或者接口之间的继承关系,注意是子类指向父类。

实现(Realization):表示的是类和接口的关系,类是接口所有特征和行为的实现。

关联(Association):表示的是类与类之间存在某种特定的对应关系,通常是一个类里面有的属性的类型是另一个类。关联可以是单向的,也可以是双向的。

聚合(Aggregation):表示的是关联关系的一种特例,是强的关联关系,表示的是整体与部分之间的关系,部分不能离开整体单独存在。通常是一个类是另外一个类(主类)的一部分,但是主类与部分类不是“同生共死”的。聚合表示一种弱的"拥有"关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;

组合(Composition):表示的是聚合的一种特殊形式,表示的是类之间更强的组合关系。通常是一个类是另外一个类(主类)的一部分,但是主类与部分类是“同生共死”的。组合是一种强的"拥有"关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样;比如:A对象可以包含B对象,B对象是A对象的属性;

依赖(Dependency):表示的是类之间的调用关系,通常是一个类里面的方法的参数类型是另一个类。依赖关系也是类与类之间的联结 。依赖总是单向的。依赖关系在 Java语言中体现为局部变量、方法的参数或者对静态方法的调用。

UML类图中关系的符号表示:

关系

符号表示

继承关系

空心三角形+实线

实现关系

空心三角形+虚线

关联关系

实线箭头

聚合关系

空心菱形+实线箭头

组合关系

实心菱形+实线箭头

依赖关系

虚线箭头

继承关系符号表示:

实现关系符号表示:

关联关系符号表示:

双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

聚合关系符号表示:

组合关系符号表示:

依赖关系符号表示:

相互之间的区别:

1.聚合与组合

(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。

(2)部件的生命周期不同

聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。

(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。

2.关联和聚合

(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。

(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。

(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。

3.关联和依赖

(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。

(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。

4.泛化和实现

实现表示类对接口的实现关系,表示方式:用一条带有空心三角箭头的虚线指向接口。

泛化表示类与类之间的继承关系、接口与接口之间的继承关系,表示方式一条带有空心三角箭头的实线指向基类(父接口)。

5.综合比较

这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:

组合>聚合>关联>依赖

其中依赖(Dependency)的关系最弱,而关联(Association),聚合(Aggregation),组合(Composition)表示的关系依次增强。换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。

而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系,而关联描述了对象之间的结构关系。

本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/266

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档