文章目录
  1. 1. 定义
  2. 2. 依赖(Dependency)
  3. 3. 关联(Association)
  4. 4. 聚合(Aggregation)
  5. 5. 组合(Composition)
  6. 6. 泛化(Generalization)
  7. 7. 实现(Realization)
  8. 8. 关联及区别

在UML的定义中,描述类和对象之间的关系,包括以下几种方式:依赖(Dependency)、关联(Association)、聚合(Aggregation)、组合(Composition)、泛化(Generalization)和实现(Realization)。现分别说明如下:

定义

类图基本符号可拆分为四类:线(虚线实线),箭头三角(空心右三角实心右三角),菱形(空心菱形实心菱形); 由这些基本的图形进行组合构成了类图的基本符号。这里要注意这几个符号的顺序,代表了类与类之间关系的耦合程度, 越向右耦合度越高。

由上述四类图形(线箭头,三角,菱形)可构成以下类图中六类常用关系,

  1. 虚线+箭头是表示即依赖的关系;
  2. 实线+箭头表示关联的关系;
  3. 虚线+空心右三角表示实现接口;
  4. 实线+空心右三角表示的是泛化,即类的继承关系;
  5. 实线+空心菱形表示的是聚合的关系;
  6. 实线+实心菱形则表示组合的关系。

看类图的时候要注意, 类图的思想其实也还没有脱离面向对象的思想,以某个类为中心,有些线是射入的而有些线是射出的。射入的线表示的是这个类被哪些类所调用而射出的线则表示该类调用了哪些类,包括泛化,关联,依赖,聚合和组合四种关系。这类似于离散数学中有关图部分的描述。

  • 类(Class):使用三层矩形框表示
    1. 第一层显示类的名称,如果是抽象类,则就用斜体显示;
    2. 第二层是字段和属性;
    3. 第三层是类的方法。

注意前面的符号,+表示public,-表示private,#表示protected, ~表示package

  • 接口:使用两层矩形框表示,与类图的区别主要是顶端有<<interface>>显示

    1. 第一行是接口名称;
    2. 第二行是接口方法。
  • 继承类(extends):用空心三角形+实线来表示

  • 实现接口(implements):用空心三角形+虚线来表示

  • 关联(Association):用实线箭头来表示,例如:燕子与气候

  • 聚合(Aggregation):用空心的菱形+实线箭头来表示

    1. 聚合:表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分,例如:公司和员工
  • 组合(Composition):用实心的菱形+实线箭头来表示

    1. 组合:部分和整体的关系,并且生命周期是相同的。例如:人与手
  • 依赖(Dependency):用虚线箭头来表示,例如:动物与氧气

  • 基数:连线两端的数字表明这一端的类可以有几个实例,比如:一个鸟应该有两只翅膀。如果一个类可能有无数个实例,则就用n来表示。关联、聚合、组合是有基数的

下面详细阐述类图中六类常用关系,

依赖(Dependency

在uml中,依赖表示为带箭头的虚线箭头指向被依赖的元素。是类与类之间的连接,表示为一个类依赖于另一个类的定义,其中一个类的变化将影响另一个类。依赖总是单向的,不应该存在双向依赖,这一点要特别注意。更具体的说,依赖可以理解为:一个类(A)对不在其实例作用域内的另一个类或对象(B)的任何类型的引用。大致包含以下几种情况:
(1)局部变量;
(2)方法的参数;
(3)静态方法的调用;

下面是依赖关系的uml示意图:
uml-dependency

1.综合上图,Class-A类的实现依赖Class-B类,即Class-A类可能要用到Class-B类的一些方法,即,要完成Class-A里的所有功能,一定要有Class-B类的某些方法协助才行.

关联(Association

在uml中,关联表示为带箭头的实线。关联可以是单向的,也可以是双向的, 还有自身关联是指拥有一个自身的引用。如果是双向关联,则可以表示为双向箭头,或者没有箭头,双向关联是指双方都拥有对方的引用, 都可以调用对方的公共属性和方法。一般来说,系统设计应表现为单向关联,这样利于维护。一个关联可以附加多重性的修饰符,表示两个类之间的数量关系。关联可以理解为:一个类(A)持有另一个类或对象(B)。具体表现为:

下面是关联关系的uml示例图:
uml-association

1.上面的关联表示,一个Employee持有(has)0个或多个TimeCard,从而可以调用其中的属性或方法,但Employee与TimeCard之间没有生命期的依赖。

聚合(Aggregation

在uml中,聚合表示为空心的菱形箭头线聚合关系是关联关系的一种,表示一种关联关系。对比关联关系,两个类是处于同一个层次的。而聚合关系,两个类处于不同的层次,强调了一个整体/局部的关系。例如一辆汽车有一个引擎,4个轮胎。在聚合关系中,体现了一种弱拥有的概念。也就是说,对象A拥有对象B,但B并不是A的组成部分。更具体的表现为,如果A由B聚合而成,则A包含B的全局对象,但B对象可以不在A对象创建时创建。回到前面的例子,汽车对象由轮胎对象聚合而成,但是轮胎对象的生命期并不受汽车对象的左右。当汽车对象销毁时,轮胎对象也可以单独存在!

下面是聚合关系的uml示意图:

uml-aggregation

从代码上看,聚合和关联没有任何区别。这里仅仅体现一种概念上的含义。在创建ClassA的时候,不一定需要同时创建ClassB的实例。 表示ClassA由ClassB聚合而成,但ClassB可以独立存在。

组合(Composition

在uml中,组合表示为实心菱形箭头线。组合也叫合成。合成关系强调了比聚合关系更加强的整体/部分的关联,例如人和四肢。和聚合关系所不同的是,在组合关系中,虽然局部不一定随着整体的销毁而销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。也就是说,组合关系中,局部的存活期一定是小于,最多是等于整体的存活期的。

下面是组合关系的uml示例图:

uml-composition

泛化(Generalization

泛化也就是通常所谓的继承关系,在uml中表示为一个带空心三角的实线。表示为is-a的关系,是对象间耦合度最大的一种关系,子类继承父类的所有细节,并可以在此基础上添加自己的特性。

下面是泛化关系的uml图:

uml-generalization

实现(Realization

所谓实现就是类对接口的定义实现,表示类是接口所有特征和行为的实现。表现为带箭头的虚线

下面的实现的uml图:

uml-realization

下面通过一副类图包含上述六类常用关系,

uml-all-class

  1. 依赖: 动物依赖氧气,水.
  2. 关联: 当一个类知道另一个类时,可以用关联关系。现在企鹅需要知道气候的变化,了解气候的变化规律.
  3. 聚合: 雅群由单只大雅聚合而成,但是单只大雁可独立存在.
  4. 组合: 一只鸟包含两支翅膀,但是翅膀无法单独存活,即生命期在鸟的生命期内.
  5. 泛化: 泛化即继承,子类继承父类属性及方法,如大雁从鸟类继承而来.
  6. 实现: 类对接口的实现,如大雁类实现了飞翔接口的所有方法(飞),所以大雁类实现了飞翔这个接口.

说明: 关联又可以分为聚合,组合,他们的主要区别体现在类和类之间关联的强度,聚合是一种较弱拥有的关联关系, 如雁群由单只大雁聚合而成,但不能强制要求单只大雁飞离雁群; 而组合是一种强拥有的聚合关系,如鸟有两支翅膀,但是单独把翅膀从鸟身上砍下来,它本身无法存活无法飞.

关联及区别

面向对象建模依赖、关联、聚合以及组合关系区别,

  1. 语义
    • 依赖表达 use a
    • 关联表达 has a
    • 聚合表达 owns a
    • 组合表达 is a part of
  2. 四种联系是递进的,表示对象之间的联系越来越紧密
  3. 代码实现形式
    • 依赖:一般对应局部变量,方法形参,静态方法调用表达
    • 关联:一般对应成员变量,有时也用方法形参的形式
    • 聚合:一般对应成员变量,聚合关系一般使用setter方法给成员变量赋值
    • 组合:一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的

另一篇值得参考的文章: UML(一) 类图详解

作者署名:朴实的一线攻城狮
本文标题:UML类图中符号定义,作用及区别总结
本文出处:http://researchlab.github.io/2016/11/23/uml-symbol-desc/
版权声明:本文由Lee Hong创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处, 否则保留追究法律责任的权利。

@一线攻城狮

关注微信公众号 @一线攻城狮

总访问:
总访客: