UML 学习

UML学习之 依赖、关联、聚合、组合的联系与区别

关系总览图

类之间可描述的关系大概有下面几种:继承、实现、关联、聚合、组合、依赖
关系的总览图如下:

继承(也叫泛化generalization)

箭头指向: 带三角箭头的实线,箭头指向父类

说明: 用于Interface和Interface之间,或者用于Class和Class之间

示例: java中常见的List集合的继承关系做为例子,List(子接口)接口继承自Collection接口(父接口),而ArrayList类(子类)继承自AbstractList(父类)这个抽象类。
java 用extends关键字

图片:

实现(Realization)

箭头指向: 带三角箭头的虚线,箭头指向接口

说明: 指的是一个class类实现interface接口(可以是多个)的功能;
在Java中此类关系通过关键字implements明确标识

示例:

图片:

依赖(Dependency)

箭头及指向: 带箭头的虚线,指向被使用者头

代码表现: 局部变量、方法的参数或者对静态方法的调用

说明: 从字面理解的话,是说一个类用到了另一个类。这种使用关系是具有偶然性的、临时性的、非常弱的。比如下图中的依赖关系,司机开车,要依赖车。在代码上表现的话一般为函数参数,或者局部变量或者对静态方法的调用。如下图的UML类图中Driver 对Car的依赖就是通过函数参数的方式。注意依赖关系只能是单向的,并且依赖关系强调的是 使用上的关系

示例:

图片:

关联(association)

箭头及指向: 带箭头的实心线,指向被拥有者

代码体现: 成员变量

说明:
是一种拥有的关系, 它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子
关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头
关联关系强调的是一种结构上的关系,他可以是单向的或者双向的,从语义级别(上下文)可以分为聚合和组合,在代码实现上关联 和聚合是很像的,主要区别在语义上:一般来说双方关系是平等的,比如我和我的朋友。在java语言上一般表现为全局变量。例如person类和company类,顾客和地址,客户和订单

图片:

重数性关联: 重数性关联关系又称为多重性关联关系(Multiplicity),表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数

聚合(aggregation)

箭头及指向: 带空心菱形的实心线,菱形指向整体

代码体现: 成员变量

说明:
是整体与部分的关系, 且部分可以离开整体而单独存在. 如车和轮胎是整体和部分的关系, 轮胎离开车仍然可以存在.
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
是关联的一种特例;聚合是整体和个体之间的关系。是has-a的关系;整体和部分可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如汽车和引擎,就是一种聚合关系,或者电脑和CPU

图片:

//汽车和引擎是一种聚合关系,java代码表现形式如下
public class Car {
   private Engine engine;

   public Car(Engine engine) {
       this.engine = engine;
   }
   public void setEngine(Engine engine) {
       this.engine = engine;
   }
   ……
}
public class Engine {
   ……
}

组合

箭头及指向: 带实心菱形的实线,菱形指向整体

代码体现: 成员变量

说明:
是整体与部分的关系, 但部分不能离开整体而单独存在. 如公司和部门是整体和部分的关系, 没有公司就不存在部门.组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期
也是关联的一种特例;是一种强聚合,表示一种contains-a的关系;部分不能脱离整体而存在,整体;生命周期结束也就意味着部分的生命周期结束; 比如人和腿的关系,腿不能脱离人单独存在,腿的生命周期也不能别人这个整体还长。还有人和大脑,大雁与翅膀

图片:

//人和嘴是一种组合关系
public class Person {
   private Mouth mouth;
   public Person() {
       mouth = new Mouth();
   }
   ……
}
public class Mouth {
   ……
}

顺序强弱关系

各种关系的强弱顺序:

泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖