在UML类图中,聚合是空心菱形,组合是实心菱形。
简单来说:
组合的关系就像一个学生和他的各个器官,手、脚、鼻子、眼睛等器官组合成了一个学生,这些器官离开了学生这个个体,也就失去了意义,无法单独生存,因此,组合关系的类具有相同的生命周期,它们的联系更加紧密。
而聚合就像一个班级有许多学生构成,学生离开了班级,作为一个个体仍然能够存活。
聚合案例
public ClassRoom{
public Student student;
public ClassRoom(Student student){
this.student = student;
}
}
可以看出,聚合类中的构造函数需要把student作为参数传入,而student类可以脱离ClassRoom独立存在。
组合案例
public Student{
public Head head;
public Student(){
head = new Head();
}
}
在组合关系的类里含有另一个类的实例化,Student在实例化之前,一定要先实例化Head类,这两个类紧密耦合在一起,它们有相同的生命周期,Head类不可以脱离Student类而独立存在。
对于信息的封装性而言:在聚合关系中,客户端可以同时了解ClassRoom类和Student类,因为他们都是独立的。而在组合关系中,客户端只知道Student类,不知道Head类的存在,因为Head类被严密的封装在Student类中。