溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java面向?qū)ο蟮暮铣?聚合復(fù)用原則是什么

發(fā)布時(shí)間:2022-01-14 11:02:50 來源:億速云 閱讀:154 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Java面向?qū)ο蟮暮铣?聚合復(fù)用原則是什么”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java面向?qū)ο蟮暮铣?聚合復(fù)用原則是什么”文章能幫助大家解決問題。

合成復(fù)用原則

在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使之成為新對(duì)象的一部分;新的對(duì)象通過向這些對(duì)象的委派達(dá)到復(fù)用這些對(duì)象的目的。

如果兩個(gè)類是“Has-a”關(guān)系應(yīng)使用合成、聚合,如果是“Is-a”關(guān)系可使用繼承。"Is-A"是嚴(yán)格的分類學(xué)意義上定義,意思是一個(gè)類是另一個(gè)類的"一種"。而"Has-A"則不同,它表示某一個(gè)角色具有某一項(xiàng)責(zé)任。 

什么是合成?什么是聚合?

合成(Composition)和聚合(Aggregation)都是關(guān)聯(lián)(Association)的特殊種類。 

聚合

聚合用來表示“擁有”關(guān)系或者整體與部分的關(guān)系。代表部分的對(duì)象有可能會(huì)被多個(gè)代表整體的對(duì)象所共享,而且不一定會(huì)隨著某個(gè)代表整體的對(duì)象被銷毀或破壞而被銷毀或破壞,部分的生命周期可以超越整體。例如,班級(jí)和學(xué)生,當(dāng)班級(jí)刪除后,學(xué)生還能存在,學(xué)生可以被培訓(xùn)機(jī)構(gòu)引用。在設(shè)計(jì)中, 聚合不應(yīng)該頻繁出現(xiàn),這樣會(huì)增大設(shè)計(jì)的耦合度。

聚合關(guān)系UML類圖

class Student {

}

class Classes{

         private Student student;

         publicClasses(Student student){

                   this.student=student;
        }

}
   

合成

合成用來表示一種強(qiáng)得多的“擁有”關(guān)系。在一個(gè)合成關(guān)系里,部分和整體的生命周期是一樣的。一個(gè)合成的新對(duì)象完全擁有對(duì)其組成部分的支配權(quán),包括它們的創(chuàng)建和湮滅等。使用程序語言的術(shù)語來說,合成而成的新對(duì)象對(duì)組成部分的內(nèi)存分配、內(nèi)存釋放有絕對(duì)的責(zé)任。一個(gè)合成關(guān)系的成分對(duì)象是不能與另一個(gè)合成關(guān)系共享的。

合成關(guān)系UML類圖

class Room{

         public Room createRoom(){
                   System.out.println(“創(chuàng)建房間”);
                   returnnew Room();
          } 
 }

class House{

         private Room room;

         public House(){ 
               room=new Room();
          }

         public void createHouse(){
                room.createRoom();
         } 
  }
 

換句話說,合成是值的聚合(Aggregation by Value),而一般說的聚合是引用的聚合(Aggregation by Reference)。

為什么使用合成/聚合復(fù)用,而不使用繼承復(fù)用?

在面向?qū)ο蟮脑O(shè)計(jì)里,有兩種基本的方法可以在不同的環(huán)境中復(fù)用已有的設(shè)計(jì)和實(shí)現(xiàn),即通過合成/聚合復(fù)用和通過繼承復(fù)用。兩者的特點(diǎn)和區(qū)別,優(yōu)點(diǎn)和缺點(diǎn)如下。 

合成/聚合復(fù)用

由于合成或聚合可以將已有對(duì)象納入到新對(duì)象中,使之成為新對(duì)象的一部分,因此新對(duì)象可以調(diào)用已有對(duì)象的功能。這樣做的好處有

  • 新對(duì)象存取成分對(duì)象的唯一方法是通過成分對(duì)象的接口。

  • 這種復(fù)用是黑箱復(fù)用,因?yàn)槌煞謱?duì)象的內(nèi)部細(xì)節(jié)是新對(duì)象看不見的。

  • 這種復(fù)用支持包裝。

  • 這種復(fù)用所需的依賴較少。

  • 每一個(gè)新的類可以將焦點(diǎn)集中到一個(gè)任務(wù)上。

  • 這種復(fù)用可以再運(yùn)行時(shí)間內(nèi)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)地引用與成分對(duì)象類型相同的對(duì)象。

一般而言,如果一個(gè)角色得到了更多的責(zé)任,那么可以使用合成/聚合關(guān)系將新的責(zé)任委派到合適的對(duì)象。當(dāng)然,這種復(fù)用也有缺點(diǎn)。最主要的缺點(diǎn)就是通過這種復(fù)用建造的系統(tǒng)會(huì)有較多的對(duì)象需要管理。 

繼承復(fù)用

繼承復(fù)用通過擴(kuò)展一個(gè)已有對(duì)象的實(shí)現(xiàn)來得到新的功能,基類明顯的捕獲共同的屬性和方法,而子類通過增加新的屬性和方法來擴(kuò)展超類的實(shí)現(xiàn)。繼承是類型的復(fù)用。

繼承復(fù)用的優(yōu)點(diǎn)
  • 新的實(shí)現(xiàn)較為容易,因?yàn)槌惖拇蟛糠止δ芸梢酝ㄟ^繼承關(guān)系自動(dòng)進(jìn)入子類。

  • 修改或擴(kuò)展繼承而來的實(shí)現(xiàn)較為容易。 

繼承復(fù)用的缺點(diǎn)
  • 繼承復(fù)用破壞包裝,因?yàn)槔^承將超類的實(shí)現(xiàn)細(xì)節(jié)暴露給了子類。因?yàn)槌惖膬?nèi)部細(xì)節(jié)常常對(duì)子類是透明的,因此這種復(fù)用是透明的復(fù)用,又叫“白箱”復(fù)用。

  • 如果超類的實(shí)現(xiàn)改變了,那么子類的實(shí)現(xiàn)也不得不發(fā)生改變。因此,當(dāng)一個(gè)基類發(fā)生了改變時(shí),這種改變會(huì)傳導(dǎo)到一級(jí)又一級(jí)的子類,使得設(shè)計(jì)師不得不相應(yīng)的改變這些子類,以適應(yīng)超類的變化。

  • 從超類繼承而來的實(shí)現(xiàn)是靜態(tài)的,不可能在運(yùn)行時(shí)間內(nèi)發(fā)生變化,因此沒有足夠的靈活性。

由于繼承復(fù)用有以上的缺點(diǎn),所有盡量使用合成/聚合而不是繼承來達(dá)到對(duì)實(shí)現(xiàn)的復(fù)用,是非常重要的設(shè)計(jì)原則。

關(guān)于“Java面向?qū)ο蟮暮铣?聚合復(fù)用原則是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI