欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

合成聚合復(fù)用原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年08月07日 10:15:52   作者:lovelion  
這篇文章主要介紹了合成聚合復(fù)用原則,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

合成聚合復(fù)用原則

合成復(fù)用原則又稱為組合/聚合復(fù)用原則(Composition/Aggregate Reuse Principle, CARP),其定義如下:

合成復(fù)用原則(Composite Reuse Principle, CRP):盡量使用對(duì)象組合,而不是繼承來達(dá)到復(fù)用的目的。

合成復(fù)用原則就是在一個(gè)新的對(duì)象里通過關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)來使用一些已有的對(duì)象,使之成為新對(duì)象的一部分;新對(duì)象通過委派調(diào)用已有對(duì)象的方法達(dá)到復(fù)用功能的目的。簡言之:復(fù)用時(shí)要盡量使用組合/聚合關(guān)系(關(guān)聯(lián)關(guān)系),少用繼承。

在面向?qū)ο笤O(shè)計(jì)中,可以通過兩種方法在不同的環(huán)境中復(fù)用已有的設(shè)計(jì)和實(shí)現(xiàn),即通過組合/聚合關(guān)系或通過繼承,但首先應(yīng)該考慮使用組合/聚合,組合/聚合可以使系統(tǒng)更加靈活,降低類與類之間的耦合度,一個(gè)類的變化對(duì)其他類造成的影響相對(duì)較少;其次才考慮繼承,在使用繼承時(shí),需要嚴(yán)格遵循里氏代換原則,有效使用繼承會(huì)有助于對(duì)問題的理解,降低復(fù)雜度,而濫用繼承反而會(huì)增加系統(tǒng)構(gòu)建和維護(hù)的難度以及系統(tǒng)的復(fù)雜度,因此需要慎重使用繼承復(fù)用。

通過繼承來進(jìn)行復(fù)用的主要問題在于繼承復(fù)用會(huì)破壞系統(tǒng)的封裝性,因?yàn)槔^承會(huì)將基類的實(shí)現(xiàn)細(xì)節(jié)暴露給子類,由于基類的內(nèi)部細(xì)節(jié)通常對(duì)子類來說是可見的,所以這種復(fù)用又稱“白箱”復(fù)用,如果基類發(fā)生改變,那么子類的實(shí)現(xiàn)也不得不發(fā)生改變;從基類繼承而來的實(shí)現(xiàn)是靜態(tài)的,不可能在運(yùn)行時(shí)發(fā)生改變,沒有足夠的靈活性;而且繼承只能在有限的環(huán)境中使用(如類沒有聲明為不能被繼承)。

擴(kuò)展

對(duì)于繼承的深入理解,大家可以參考《軟件架構(gòu)設(shè)計(jì)》一書作者溫昱先生的文章——《見山只是山見水只是水——提升對(duì)繼承的認(rèn)識(shí)》。

由于組合或聚合關(guān)系可以將已有的對(duì)象(也可稱為成員對(duì)象)納入到新對(duì)象中,使之成為新對(duì)象的一部分,因此新對(duì)象可以調(diào)用已有對(duì)象的功能,這樣做可以使得成員對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)對(duì)于新對(duì)象不可見,所以這種復(fù)用又稱為“黑箱”復(fù)用,相對(duì)繼承關(guān)系而言,其耦合度相對(duì)較低,成員對(duì)象的變化對(duì)新對(duì)象的影響不大,可以在新對(duì)象中根據(jù)實(shí)際需要有選擇性地調(diào)用成員對(duì)象的操作;合成復(fù)用可以在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行,新對(duì)象可以動(dòng)態(tài)地引用與成員對(duì)象類型相同的其他對(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é)任。

下面通過一個(gè)簡單實(shí)例來加深對(duì)合成復(fù)用原則的理解:

Sunny軟件公司開發(fā)人員在初期的CRM系統(tǒng)設(shè)計(jì)中,考慮到客戶數(shù)量不多,系統(tǒng)采用MySQL作為數(shù)據(jù)庫,與數(shù)據(jù)庫操作有關(guān)的類如CustomerDAO類等都需要連接數(shù)據(jù)庫,連接數(shù)據(jù)庫的方法getConnection()封裝在DBUtil類中,由于需要重用DBUtil類的getConnection()方法,設(shè)計(jì)人員將CustomerDAO作為DBUtil類的子類,初始設(shè)計(jì)方案結(jié)構(gòu)如圖1所示:

圖1  初始設(shè)計(jì)方案結(jié)構(gòu)圖

隨著客戶數(shù)量的增加,系統(tǒng)決定升級(jí)為Oracle數(shù)據(jù)庫,因此需要增加一個(gè)新的OracleDBUtil類來連接Oracle數(shù)據(jù)庫,由于在初始設(shè)計(jì)方案中CustomerDAO和DBUtil之間是繼承關(guān)系,因此在更換數(shù)據(jù)庫連接方式時(shí)需要修改CustomerDAO類的源代碼,將CustomerDAO作為OracleDBUtil的子類,這將違反開閉原則?!井?dāng)然也可以修改DBUtil類的源代碼,同樣會(huì)違反開閉原則。】

現(xiàn)使用合成復(fù)用原則對(duì)其進(jìn)行重構(gòu)。

根據(jù)合成復(fù)用原則,我們在實(shí)現(xiàn)復(fù)用時(shí)應(yīng)該多用關(guān)聯(lián),少用繼承。因此在本實(shí)例中我們可以使用關(guān)聯(lián)復(fù)用來取代繼承復(fù)用,重構(gòu)后的結(jié)構(gòu)如圖2所示:

圖2  重構(gòu)后的結(jié)構(gòu)圖

在圖2中,CustomerDAO和DBUtil之間的關(guān)系由繼承關(guān)系變?yōu)殛P(guān)聯(lián)關(guān)系,采用依賴注入的方式將DBUtil對(duì)象注入到CustomerDAO中,可以使用構(gòu)造注入,也可以使用Setter注入。如果需要對(duì)DBUtil的功能進(jìn)行擴(kuò)展,可以通過其子類來實(shí)現(xiàn),如通過子類OracleDBUtil來連接Oracle數(shù)據(jù)庫。由于CustomerDAO針對(duì)DBUtil編程,根據(jù)里氏代換原則,DBUtil子類的對(duì)象可以覆蓋DBUtil對(duì)象,只需在CustomerDAO中注入子類對(duì)象即可使用子類所擴(kuò)展的方法。例如在CustomerDAO中注入OracleDBUtil對(duì)象,即可實(shí)現(xiàn)Oracle數(shù)據(jù)庫連接,原有代碼無須進(jìn)行修改,而且還可以很靈活地增加新的數(shù)據(jù)庫連接方式。

相關(guān)文章

  • springboot中如何引入AOP切面編程

    springboot中如何引入AOP切面編程

    這篇文章主要介紹了springboot中如何引入AOP切面編程問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring框架十一種常見異常的解決方法匯總

    Spring框架十一種常見異常的解決方法匯總

    今天小編就為大家分享一篇關(guān)于Spring框架十一種常見異常的解決方法匯總,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java 自定義Spring框架與核心功能詳解

    Java 自定義Spring框架與核心功能詳解

    Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)
    2021-10-10
  • Java隨機(jī)值設(shè)置(java.util.Random類或Math.random方法)

    Java隨機(jī)值設(shè)置(java.util.Random類或Math.random方法)

    在編程中有時(shí)我們需要生成一些隨機(jī)的字符串作為授權(quán)碼、驗(yàn)證碼等,以確保數(shù)據(jù)的安全性和唯一性,這篇文章主要給大家介紹了關(guān)于Java隨機(jī)值設(shè)置的相關(guān)資料,主要用的是java.util.Random類或Math.random()方法,需要的朋友可以參考下
    2024-08-08
  • Java如何將任意類型的Object對(duì)象轉(zhuǎn)換為相應(yīng)的實(shí)體對(duì)象

    Java如何將任意類型的Object對(duì)象轉(zhuǎn)換為相應(yīng)的實(shí)體對(duì)象

    這篇文章主要介紹了Java如何將任意類型的Object對(duì)象轉(zhuǎn)換為相應(yīng)的實(shí)體對(duì)象問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 5種解決Java獨(dú)占寫文件的方法

    5種解決Java獨(dú)占寫文件的方法

    這篇文章主要介紹了5種解決Java獨(dú)占寫文件的方法,需要的朋友可以參考下
    2015-12-12
  • springboot2.3 整合mybatis-plus 高級(jí)功能(圖文詳解)

    springboot2.3 整合mybatis-plus 高級(jí)功能(圖文詳解)

    這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解

    透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解

    Java Bean是一種 Java 編程語言編寫的可重用軟件組件,包括符合一定規(guī)范的Java 類、屬性和方法,用于描述和處理應(yīng)用程序中的數(shù)據(jù)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 在Spring中使用JDBC和JDBC模板的講解

    在Spring中使用JDBC和JDBC模板的講解

    今天小編就為大家分享一篇關(guān)于在Spring中使用JDBC和JDBC模板的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java實(shí)現(xiàn)字符串匹配求兩個(gè)字符串的最大公共子串

    java實(shí)現(xiàn)字符串匹配求兩個(gè)字符串的最大公共子串

    這篇文章主要介紹了java實(shí)現(xiàn)求兩個(gè)字符串最大公共子串的方法,詳細(xì)的描述了兩個(gè)字符串的最大公共子串算法的實(shí)現(xiàn),需要的朋友可以參考下
    2016-10-10

最新評(píng)論