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