一、概述
UML类图中的关系主要是(按照耦合度递增的顺序):
- 依赖
- 关联
- 聚合
- 组合
- 继承
聚合和组合从本质上讲都是同属于关联关系,但是在耦合度和信息封装程度上有差异。
二、聚合和组合的类图
以网吧为例,一个网吧有多台电脑,一台电脑又是由很多的硬件+外设组成,所以他们的之间的关系大致如下图所示:
1. 聚合
聚合类图反映在代码上就是:
public class InternetBar{
private List<Computer> computers;
public InternetBar(List<Computer> comps){
this.computers = comps;
}
}
2. 组合
组合类图反映在代码上就是:
public class Computer{
private Cpu cpu;
public Computer(){
this.cpu = new Cpu();
}
}
三、差异比较
1. 代码层面
a. 聚合关系的类含有另一个类作为参数
网吧类(InternetBar)的构造函数只需要传入一个电脑的列表(List<Computer>),而这些个电脑可以独立于网吧而存在。
b. 组合关系的类含有另一个类的初始化
电脑类(Computer)的构造函数内部初始化了一个新的Cpu对象,这两个类紧密的偶合在一起,他们有相同的生命周期,Cpu类不能脱离Computer类单独存在。
2. 信息封装层面
a. 聚合关系中
客户端可以同时了解到网吧类和电脑类,他们彼此之间是独立的。
b. 组合关系中
客户端只能够识别电脑类,但无法知晓Cpu类的存在,因为Cpu类被严密地封装在Computer类中。
网友评论