組合(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類中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM