聚合和組合的區別以及代碼實現


一、定義上區別:

聚合與組合都是表示整體和個體的關聯關系,他們之間最大的區別在於子類被父類控制的程度。組合的父子類關系比聚合要強

聚合:has-a關系,父類包含子類,子類可以獨立於父類存在

聚合關系用下圖符號表示:表示B由A聚合而成

 

 

組合:part-of關系,父類擁有子類,子類不能獨立於父類存在

組合關系用下圖符號表示:表示B由A組合而成

 

 

(不過,一個關聯關系是聚合還是組合,需要根據實際的業務需求來斷定。為什么這么說,因為可能相同超類和子類,在不同的業務場景,關聯關系會發生變化。)

舉例說明:   有三個類Name,Student,Address,反應的是學生與姓名和地址之間的關系,若類的使用方法如下,則代表Name和Address與Student之間是一個聚合關系.因為此時Name和Address類在Student類中出現都是以一種地址的形式,這兩種對並沒有在Student類中開辟新的空間,而是將已有的對象地址傳給了Student類的屬性。那么當外面的name和address對象的屬性值發生改變的時候,那么Student類中的屬性值會自動的發生改變。

 public  class Name{                                            public class Student {                                                                                       public  class Address{  

                                                                                  private Name name;

                                                                                  private Address address;

                                                                                 public Student(Name name,Address address){         

                                                                                this.name = name;

                                                                                this.address = address;

                                                                                      }

}                                                                              }                                                                                                                                  }

若是Student類以下面的方式使用Name和Address類,那么他們之間就是一種組合的關系,因為我們可以在下面的代碼中看到,在Student類中Name和Address開辟新的空間,有了自己獨立的空間和屬性值,此時傳給Student類中屬性的值不是一個地址,而是一個獨立的對象,這個對象和外面name,address沒有任何關系,出了屬性值一樣以外,外面對象值的改變不會對Student中name和address對象屬性只有任何的影響。

 public  class Name{                                            public class Student {                                                                                       public  class Address{  

                                                                                  private Name name;

                                                                                  private Address address;

                                                                                 public Student(Name name,Address address){         

                                                                                this.name = new Name(name);

                                                                                this.address = new Address(address);

                                                                                      }

}                                                                              }                                                                                                                                  }

二、代碼驗證

 在我上傳的文件中有聚合和組合的源代碼文件。


免責聲明!

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



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