详解 | UML类图符号、各种关系说明以及举例_ITMuch.com的博客-程序员宅基地

技术标签: 接口  java  编程语言  数据库  class  

点击上方 IT牧场 ,选择 置顶或者星标

技术干货每日送达!

作者 | duanxz

来源 | https://www.cnblogs.com/duanxz/archive/2012/06/13/2547801.html

UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。

  • 依赖(Dependency:元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。

  • 泛化(Generalization:通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。

  • 实现(Realize:元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。

  • 关联(Association:元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。

  • 聚合(Aggregation:关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。

  • 组合(Composition:组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。

1.1.1    依赖(Dependency):虚线箭头表示

1、依赖关系也是类与类之间的联结 2、依赖总是单向的。(#add 注意,要避免双向依赖。一般来说,不应该存在双向依赖。) 3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。

(软件开发中,往往会设计一些公用类,供别的类调用,如果这些公用类出问题了,那调用这些公用类的类都会因此而出问题。两个元素之间的一种关系,其中一个元素(提供者)的变化将影响另一个元素(客体),或向它提供所需信息 显示一个类引用另一个类)

方法参数示例:

public class Person
{
    void buy(Car car)
   {
       ...
    }
}

表示方法:虚线加箭头

特点:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。

依赖关系可以分为以下四类:

1) 使用依赖(Usage)表示客户使用提供者提供的服务以实现它的行为,包括:

  • 使用<>--声明使用一个类时需要用到已存在的另一个类。

  • 调用<>--声明一个类调用其他类的操作的方法。

  • 参数<>--声明一个操作和它的参数之间的关系。

  • 发送<>--声明信号发送者和信号接收者之间的关系。

  • 实例化<>--声明用一个类的方法创建了另一个类的实例。

2) 抽象依赖(Abstraction)表示客户与提供者之间用不同的方法表现同一个概念,通常一个概念更抽象,一个概念更具体。包括:

  • 跟踪<>--声明不同模型中的元素之间存在一些连接但不如映射精确。

  • 精化<>--声明具有两个不同语义层次上的元素之间的映射。

  • 派生<>--声明一个实例可以从另一个实例导出。

3) 授权依赖(Permission)表达提供者为客户提供某种权限以访问其内容的情形。包括:

  • 访问<>--允许一个包访问另一个包的内容。

  • 导入<>--允许一个包访问另一个包的内容并为被访问包的组成部分增加别名。

  • 友元<>--允许一个元素访问另一个元素,不管被访问的元素是否具有可见性。

4) 绑定依赖(Binding)较高级的依赖类型,用于绑定模板以创建新的模型元素,包括:

  • 绑定<>--为模板参数指定值,以生成一个新的模型元素。

1.1.2    关联(Association):实线箭头表示

1、关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。2、关联可以是双向的,也可以是单向的(#add还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。3、在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。

public class 徒弟
{  

}

public class 唐僧
{
     protected: list<徒弟> tdlist;
}

表示方法:实线箭头

特征:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示。(A类有一个成员变量保存的是B类的一个引用,也就是说由A类可以找到B类)

1.1.3    聚合(Aggregation):带空心菱形头表示

1、聚合关系是关联关系的一种,是强的关联关系。2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。

public class 引擎
 {

 }
public class 轮胎
 {

 }
public class 汽车
{
        protected:引擎 engine;
        protected:轮胎 tyre[4];
}

表示方法:空心菱形头

特征:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联;

1.1.4    组合(Composition):带实心菱形头的实线表示

1、合成关系是关联关系的一种,是比聚合关系还要强的关系。2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

class 肢
 {
 }
 class 人
 {
        protected:  肢   limb[4];
 }

表示方法:一般是实心菱形加实线箭头表示

特征:属于是关联的特殊情况,也体现了体现部分-整体关系,是一种强“拥有关系”;整体与部分有相同的生命周期,是一种强关联;

1.1.5    泛化(Generalization):

带空心箭头的实线线表示

泛化(下图)表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中,用extends关键字来直接表示这种关系。

泛化关系表示类与类之间的继承关系,接口与接口之间的继承关系。如下图:

img

1.1.6    实现(Realization):空心箭头和虚线表示

实例(图I)关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。表达一种说明元素与实现元素之间的关系;

图I

二、相互之间的区别

1.聚合与组合

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

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

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

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

img
  • “弱”包含表示如果部门没有了,员工也可以继续存在;

  • “强”包含表示如果部门没有了,员工也不再存在;

在做软件需求时,往往会将所有的包含关系画成“弱”包含,后面发现某些关系可以表示为“强”包含是,才转为实心菱形。

2.关联和聚合

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

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

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

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

3.关联和依赖

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

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

4.泛化和实现

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

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

5.综合比较

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

组合>聚合>关联>依赖

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

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

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论

近期热文

LinkedBlockingQueue vs ConcurrentLinkedQueue解读Java 8 中为并发而生的 ConcurrentHashMapRedis性能监控指标汇总最全的DevOps工具集合,再也不怕选型了!微服务架构下,解决数据库跨库查询的一些思路聊聊大厂面试官必问的 MySQL 锁机制

关注我

喜欢就点个"在看"呗^_^

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lilizhou2008/article/details/108413850

智能推荐

C#操作Excel_‭‭‭ ‭的博客-程序员宅基地

首先添加引用操作Excel的引用之后再代码添加using引用using MSExcel = Microsoft.Office.Interop.Excel;//下面我们可以直接用MSExcel 来代替Microsoft.Office.Interop.Excelusing System.IO;string fileName = @"文件路径"; ...

z3安装到Anaconda环境_突然成功_brightendavid的博客-程序员宅基地

此前多次安装python z3库未果,会在安装到一半 时候跳出提示,写了一大堆的网址,总之是没有跳出success。根据上古材料显示,z3只能安装在python2上面。于是安装在kali linux 上的python2上,但是安装在虚拟机上总是用起来不顺,也没有在虚拟机上安装ide。在某一个没有星星的夜晚,偶然想起来一句神秘指令pip install z3-solver幸甚至哉水文+1...

Vue3教程:英雄指南(三)_朱nw的博客-程序员宅基地

前言最近在看Angular的文档,发现Angular官网的英雄指南的教程挺有意思的,能比较好的一步一步教别人搭建一个项目。最近Vue3也比较火,决定用Vue3仿造Angular的英雄指南写一个完整的教程,也算是一个对自己知识的梳理吧,顺便学习一下Vue3的新特性。由于笔者的知识有限,如果文中有任何错误,希望读者在评论区中直接指出来。VUE版本 3.0.2 Vite版本1.0.0-rc.8之前的内容请看:Vue3 教程:英雄指南(一)Vue3 教程:英雄指南(二)组合式API组件不应该直接获

用故事讲述淘宝网架构成长的危机与机遇_猴哥_IT小菜鸟的博客-程序员宅基地

全球系统架构师大会于8月10日-12日在深圳万科国际会议中心举行。在10日下午的演讲中,来自淘宝技术大学的校长赵超讲述淘宝的业务和架构是怎么互相影响,从一台单机系统发展到现在世界前列规模的过程。载演讲中主要描述了淘宝几次大的架构变迁的前因后果,包括业务的驱动、架构的选型、变迁的过程、新技术对业务的推动,以及在这个过程中走过的弯路和犯过的错误。▲全球系统架构师大会现场报道  淘宝网的现状  淘宝网

leetcode 区间问题_Wuuuuuu2019的博客-程序员宅基地_leetcode 区间

文章目录304. 二维区域和检索 - 矩阵不可变【前缀和】二维前缀和二维前缀和一维前缀和模板总结995. K 连续位的最小翻转次数【贪心、差分、滑动窗口】!!!贪心差分滑动窗口总结354. 俄罗斯套娃信封问题【朴素dp,二分dp,树状数组】朴素dp二分+dp树状数组300. 最长递增子序列【朴素dp、贪心+二分】!!!贪心+二分思路1893. 检查是否区域内所有整数都被覆盖【差分】差分1310. 子数组异或查询【前缀和、树状数组】304. 二维区域和检索 - 矩阵不可变【前缀和】给定一个二维矩阵 mat

评测本年度最新款第三方评论系统 ——网易云跟贴的优势与不足_weixin_34253539的博客-程序员宅基地

首先,我不是技术控,对软件的理解以及系统的运用都是门外汉。我跟众多网民一样,平时了解到什么趣事,下班后,就写个帖子分享一下;每天在各大门户上看到好帖子,就会在评论框下跟个帖;在留言处看到有共鸣的跟帖,就回个帖。然而在前天,一位我尊敬的自媒体大哥突然问我“网易推出网易云跟贴,你怎么看?”当时我楞了一下,但又不好直接说不知道,毕竟尊重大于疑惑,于是我说,请给我两天时间,我研究一下,再回复我的看法。最后...

随便推点

golang压缩图片_千年恨的博客-程序员宅基地_golang 图片压缩

golang压缩图片示例代码func compress(imagePath string) { //需要压缩 imgfile, err := os.Open(imagePath) if err != nil { log.Println("os.Open::", err) return } defer imgfile.Close() jpgimg, err := jpeg.Decode(imgfile) if err != nil { log.Println("jpeg.

解决spring的java.lang.IllegalArgumentException异常。_iteye_10291的博客-程序员宅基地

最近搭建在eclipse中搭建spring环境,使用过JUNIT测试了一个spring静态工厂实例化bean的例子,出现了java.lang.IllegalArgumentException异常。环境信息列表:系统平台: window x64开发平台: eclipse EE 4.5+spring version : 3.2JDK: 1.8****************...

Linux和Ubuntu的区别与联系;Linux和Unix区别_zhaidada01的博客-程序员宅基地

Linux和Ubuntu : 大家经常会说Linux操作系统,Ubuntu操作系统,这种叫法是不正确的,严格意义上讲,Linux并不是操作系统,而是属于操作系统的一个内核。 由于Linux是开源的,免费的,所以程序员可以根据自己的兴趣和灵感对其进行改变,组合成自己想要的操作系统; 以Linux为内核的操作系统很多,我们称这种操作系统为linux的发行版,或者直接用linux来统称以linux为内核的操作系统。Linux和Unix通常称linux是类似Unix...

android 线程中启动线程的方法,Android:2.3.6主要线程阻塞当我请求在Activity.onCreate方法中启动两个服务时..._一身诗意千寻瀑zz的博客-程序员宅基地

我正在开发一个应用程序,我需要在应用程序启动时启动后台服务 .最初我在Application.onCreate()方法上添加了第一个服务的启动过程 .之后,我意识到如果用户因任何原因停止了后台线程,我需要重新启动该服务 . 因此,我将服务启动代码从Application.onCreate()移动到主要的Activivity.onResume() .根据文档,在已经运行的服务上调用startServ...

人工智能资料_weixin_34319640的博客-程序员宅基地

本课程适合对人工智能特别感兴趣的朋友学习,是由北京尚学堂人工智能学员研发,已经有数千位学员受益。现将内容全程公布,欢迎大家传播和下载。也可以到我们官方网站:www.bjsxt.com咨询最新内容,或者到www.itbaizhan.cn在线学习。每个月我们都会对课程做更新,可以加人工智能学院大智老师微信号(bjsxt_ai_dazhi):课程大纲如下:01_人工智能开发及远景介绍(预科)【尚学堂...

NFS客户端、服务器协商读写粒度(rsize、wsize)流程 【转】_weixin_34417200的博客-程序员宅基地

   rsize和wsize决定了网络文件系统(NFS)一次网络交互所能够读写的数据块的大小,rsize和wsize的大小对网络文件系统(NFS)的性能有重要影响。rsize和wsize的大小是在用户配置的基础上客户端和服务器端共同协商的结果。       本文面向NFS的开发者和维护者,主要介绍rsize和wsize在客户端和服务器之间协商的流程,同时介绍rsize和wsize的设置的方法。...