您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java面向對象的合成/聚合復用原則是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java面向對象的合成/聚合復用原則是什么”文章能幫助大家解決問題。
在一個新的對象里面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達到復用這些對象的目的。
如果兩個類是“Has-a”關系應使用合成、聚合,如果是“Is-a”關系可使用繼承。"Is-A"是嚴格的分類學意義上定義,意思是一個類是另一個類的"一種"。而"Has-A"則不同,它表示某一個角色具有某一項責任。
合成(Composition)和聚合(Aggregation)都是關聯(Association)的特殊種類。
聚合用來表示“擁有”關系或者整體與部分的關系。代表部分的對象有可能會被多個代表整體的對象所共享,而且不一定會隨著某個代表整體的對象被銷毀或破壞而被銷毀或破壞,部分的生命周期可以超越整體。例如,班級和學生,當班級刪除后,學生還能存在,學生可以被培訓機構引用。在設計中, 聚合不應該頻繁出現,這樣會增大設計的耦合度。
聚合關系UML類圖
class Student {
}
class Classes{
private Student student;
publicClasses(Student student){
this.student=student;
}
}
合成用來表示一種強得多的“擁有”關系。在一個合成關系里,部分和整體的生命周期是一樣的。一個合成的新對象完全擁有對其組成部分的支配權,包括它們的創建和湮滅等。使用程序語言的術語來說,合成而成的新對象對組成部分的內存分配、內存釋放有絕對的責任。一個合成關系的成分對象是不能與另一個合成關系共享的。
合成關系UML類圖
class Room{
public Room createRoom(){
System.out.println(“創建房間”);
returnnew Room();
}
}
class House{
private Room room;
public House(){
room=new Room();
}
public void createHouse(){
room.createRoom();
}
}
換句話說,合成是值的聚合(Aggregation by Value),而一般說的聚合是引用的聚合(Aggregation by Reference)。
在面向對象的設計里,有兩種基本的方法可以在不同的環境中復用已有的設計和實現,即通過合成/聚合復用和通過繼承復用。兩者的特點和區別,優點和缺點如下。
由于合成或聚合可以將已有對象納入到新對象中,使之成為新對象的一部分,因此新對象可以調用已有對象的功能。這樣做的好處有
新對象存取成分對象的唯一方法是通過成分對象的接口。
這種復用是黑箱復用,因為成分對象的內部細節是新對象看不見的。
這種復用支持包裝。
這種復用所需的依賴較少。
每一個新的類可以將焦點集中到一個任務上。
這種復用可以再運行時間內動態進行,新對象可以動態地引用與成分對象類型相同的對象。
一般而言,如果一個角色得到了更多的責任,那么可以使用合成/聚合關系將新的責任委派到合適的對象。當然,這種復用也有缺點。最主要的缺點就是通過這種復用建造的系統會有較多的對象需要管理。
繼承復用通過擴展一個已有對象的實現來得到新的功能,基類明顯的捕獲共同的屬性和方法,而子類通過增加新的屬性和方法來擴展超類的實現。繼承是類型的復用。
新的實現較為容易,因為超類的大部分功能可以通過繼承關系自動進入子類。
修改或擴展繼承而來的實現較為容易。
繼承復用破壞包裝,因為繼承將超類的實現細節暴露給了子類。因為超類的內部細節常常對子類是透明的,因此這種復用是透明的復用,又叫“白箱”復用。
如果超類的實現改變了,那么子類的實現也不得不發生改變。因此,當一個基類發生了改變時,這種改變會傳導到一級又一級的子類,使得設計師不得不相應的改變這些子類,以適應超類的變化。
從超類繼承而來的實現是靜態的,不可能在運行時間內發生變化,因此沒有足夠的靈活性。
由于繼承復用有以上的缺點,所有盡量使用合成/聚合而不是繼承來達到對實現的復用,是非常重要的設計原則。
關于“Java面向對象的合成/聚合復用原則是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。