组合(Composition)和聚合(Aggregation)的区别

在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类中。

posted @ 2018-09-15 13:31  Alkane  阅读(6843)  评论(0编辑  收藏  举报