表示方式
UML中描述对象和类之间相互关系的方式包括:
- 依赖(Dependency)。虚线+箭头,指向被依赖元素。
- 关联(Association)。实线+箭头,指向被依赖元素。
- 聚合(Aggregation)。空心菱形+实线+箭头,指向被依赖元素(部分)。
- 组合(Composition)。实心菱形+实线+箭头,指向被依赖元素(部分)。
- 泛化(Generalization)。实线+空心箭头,指向继承的父类。
- 实现(Realization)。虚线+空心箭头,指向实现的接口。
依赖
- 依赖是单向的。
- 依赖关系在Java/C++语言中体现为局部变量、方法参数、对静态方法的调用。
- 依赖不具有“拥有关系”,而是一种“相识关系”。
方法参数示例:
public class Person
{
void buy(Car car)
{
...
}
}
关联
- 关联可以是双向的,也可以是单向的(还有自身关联)。双向关联可以有2个箭头或没有箭头,单向关联有1个箭头。
- 在Java/C++中,关联关系通过使用成员变量来实现。
- 关联表现为“拥有关系”。
public class 徒弟
{
}
public class 唐僧
{
protected: list<徒弟> tdlist;
}
聚合
- 聚合关系是关联关系的一种,是强的关联关系。
- 聚合是整体和部分之间的关系,是一种弱拥有关系,整体和部分可以有不一样的生命周期。
- 聚合关系也是通过成员变量来实现,但关联关系所涉及的2个类处于同一个层次上,而聚合关系2个类处于不同的层次上,一个代表整体,一个代表部分。
- 关联与聚合仅从Java/C++语法上无法分辨,需要考察所涉及的类之间的逻辑关系。
public class 引擎
{
}
public class 轮胎
{
}
public class 汽车
{
protected:引擎 engine;
protected:轮胎 tyre[4];
}
组合
- 组合关系是关联关系的一种,是比聚合关系还要强的关系。
- 组合关系中整体与部分拥有相同的生命周期。
class 肢
{
}
class 人
{
protected: 肢 limb[4];
}
泛化
表示类或接口之间的继承关系。
Java中使用extents关键字。
实现
表示类实现接口。
Java中使用implements关键字。
几种关系的综合比较
组合>聚合>关联>依赖
其中依赖(Dependency)的关系最弱,而关联(Association),聚合(Aggregation),组合(Composition)表示的关系依次增强。
换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。
而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系,而关联描述了对象之间的结构关系。