UML各类关系介绍


继承关系(generalization)

继承关系用一条带空心箭头的直线表示。如下图所示(A继承自B):

A继承自B

继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。继承关系为is-a的关系,是类与类或者接口与接口之间最常见的关系之一,在Java中此类关系通过关键字extends来表示。

注意:表现在代码中,继承关系表现为一个类继承另一个类或者一个接口继承另一个接口

实现关系(realization)

实现关系是用一条带空心箭头的虚线表示。如下图所示(A实现B)::

A实现B

实现指的是一个class类实现interface接口(可以是多个)的功能。实现是类与接口之间最常见的关系之一,在Java中此类关系通过关键字implements来表示。

注意:表现在代码中,实现关系表现为普通类实现某个接口

关联关系(association)

关联关系是用一条可能会有方向的直线表示的。关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如上图,表示A关联B,但B不关联A;如下图所示:

A关联B

关联关系体现的是两个类、或者类与接口之间语义级别的一种强依赖的结构关系,是一种长期的静态稳定的关系,通常与运行状态无关,一般由常识等因素决定的。

例如:乘车人和车票之间就是一种关联关系。

注意:表现在代码中,被关联类以类属性的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量

聚合关系(aggregation)

聚合关系用一条带空心菱形箭头的直线表示,如下图所示A聚合到B,或者说B由A组成。

A聚合到B

聚合关系用于表示实体对象之间的关系,表示整体由部分构成的意思。聚合是关联关系的一种特例,它体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。例如一个部门由多个员工组成。

注意:表现在代码中,和关联关系是一致的,只能从语义级别来区分。聚合与组合不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在;例如,部门撤销了,人员不会消失,他们依然存在。

组合关系(composition)

组合关系用一条带实心菱形箭头的直线表示,如下图表示A组成B,或者B由A组成。

A组合到B

组合关系同样表示整体由部分组成的意思。与聚合关系一样,组合也是关联关系的一种特例,它体现的是一种整体与部分不可分割的关系,即contains-a的关系,这种关系比聚合更强,也称为强聚合。例如公司由多个部门组成组合,但此时整体与部分是不可分离的,整体的生命周期结束也就意味着部分的生命周期结束。

注意:表现在代码中,和关联关系是一致的,只能从语义级别来区分。组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也就不存在了。例如,公司不存在了,部门也将不存在了。

依赖关系(dependency)

依赖关系是用一套带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系。

A依赖于B

依赖关系是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A,与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化依赖关系也可能发生变化。

显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生。

注意:表现在代码中,依赖关系体现为类的构造方法及类方法的传入参数

UML类关系图示例

请看以下这个UML类关系图:

UML示例

  • 开车的类图结构表示的是一个接口
  • 有一个自行车的抽象类,实现了开车的接口,它们之间的关系为实现关系,使用带空心三角箭头的虚线表示
  • 自行车与摩拜单车之间是继承关系,使用带空心三角箭头的实线表示
  • 学生上学需要用到摩拜单车,与摩拜单车是一种依赖关系,使用带箭头的虚线表示
  • 学生与身份证之间为关联关系,使用一根实线表示,如果两个类之间互相通过属性引用,则是双向关联关系
  • 学生与班级、学生与学校之间是聚合关系,使用带空心菱形箭头的实线表示
  • 学校与班级是组合关系,使用带实心菱形箭头的实线表示

Author: CarpCai
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source CarpCai !
 Previous
网络IO模型 网络IO模型
这篇文章由一道题开始: 关于网络IO模型,下列哪一项是正确的? A.Select比Epoll更快 B.nginx使用的是select模型 C.apache支持select和epoll两种方式的切换 D.epoll能支持更大的并发 看
2019-01-22 Carp Choi
Next 
Go的异常处理 defer, panic, recover Go的异常处理 defer, panic, recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在G
  TOC