只看代码,你是无法区分关联,聚合和组合的,具体是哪一种关系,只能从语义级别来区分。现在我们来从语义方面开始解释组合与聚合。
组合:
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。
实例:
final class Car {
private final Engine engine;
Car(EngineSpecs specs) {
engine = new Engine(specs);
}
void move() {
engine.work();
}
}
在组合中,整体与部分是相依相存,状态保持一致的。
聚合:
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系。即 a 与 b
没有必然的联系。
实例:
final class Car {
private Engine engine;
void setEngine(Engine engine) {
this.engine = engine;
}
void move() {
if (engine != null)
engine.work();
}
}
has 不是 must has,a可以有b,也可以没有。a是整体,b是部分,整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。