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示例

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

文章作者: blinkfox
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 blinkfox !
评论
 上一篇
Java集合框架知识整理 Java集合框架知识整理
Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。 集合类关系梳理 Collection接口继承了Iterable接口,依赖了Predicate、Spliterator、Stream接口(这些均为Java8
2018-10-24
下一篇 
面向对象编程的理解 面向对象编程的理解
面向过程和面向对象面向过程思想概述面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。 面向对象思想概述当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。可随着需求的更改,功能的增多,
2018-10-21
  目录