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