最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

擴(kuò)展

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

由于組合或聚合關(guān)系可以將已有的對(duì)象(也可稱為成員對(duì)象)納入到新對(duì)象中,使之成為新對(duì)象的一部分,因此新對(duì)象可以調(diào)用已有對(duì)象的功能,這樣做可以使得成員對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)對(duì)于新對(duì)象不可見(jiàn),所以這種復(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é)任。

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

Sunny軟件公司開(kāi)發(fā)人員在初期的CRM系統(tǒng)設(shè)計(jì)中,考慮到客戶數(shù)量不多,系統(tǒng)采用MySQL作為數(shù)據(jù)庫(kù),與數(shù)據(jù)庫(kù)操作有關(guān)的類如CustomerDAO類等都需要連接數(shù)據(jù)庫(kù),連接數(shù)據(jù)庫(kù)的方法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ù)庫(kù),因此需要增加一個(gè)新的OracleDBUtil類來(lái)連接Oracle數(shù)據(jù)庫(kù),由于在初始設(shè)計(jì)方案中CustomerDAO和DBUtil之間是繼承關(guān)系,因此在更換數(shù)據(jù)庫(kù)連接方式時(shí)需要修改CustomerDAO類的源代碼,將CustomerDAO作為OracleDBUtil的子類,這將違反開(kāi)閉原則。【當(dāng)然也可以修改DBUtil類的源代碼,同樣會(huì)違反開(kāi)閉原則?!?br />

現(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ù)用來(lái)取代繼承復(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ò)展,可以通過(guò)其子類來(lái)實(shí)現(xiàn),如通過(guò)子類OracleDBUtil來(lái)連接Oracle數(shù)據(jù)庫(kù)。由于CustomerDAO針對(duì)DBUtil編程,根據(jù)里氏代換原則,DBUtil子類的對(duì)象可以覆蓋DBUtil對(duì)象,只需在CustomerDAO中注入子類對(duì)象即可使用子類所擴(kuò)展的方法。例如在CustomerDAO中注入OracleDBUtil對(duì)象,即可實(shí)現(xiàn)Oracle數(shù)據(jù)庫(kù)連接,原有代碼無(wú)須進(jìn)行修改,而且還可以很靈活地增加新的數(shù)據(jù)庫(kù)連接方式。

相關(guān)文章

  • Java實(shí)現(xiàn)TFIDF算法代碼分享

    Java實(shí)現(xiàn)TFIDF算法代碼分享

    這篇文章主要介紹了Java實(shí)現(xiàn)TFIDF算法代碼分享,對(duì)算法進(jìn)行了簡(jiǎn)單介紹,概念,原理,以及實(shí)現(xiàn)代碼的分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 借助Maven搭建Hadoop開(kāi)發(fā)環(huán)境的最詳細(xì)教程分享

    借助Maven搭建Hadoop開(kāi)發(fā)環(huán)境的最詳細(xì)教程分享

    在Maven插件的幫助下,VSCode寫Java其實(shí)非常方便,所以本文就來(lái)和大家詳細(xì)講講如何借助maven用VScode搭建Hadoop開(kāi)發(fā)環(huán)境,需要的可以參考下
    2023-05-05
  • Sentinel初始化啟動(dòng)流程詳細(xì)介紹

    Sentinel初始化啟動(dòng)流程詳細(xì)介紹

    Sentinel是一個(gè)分布式系統(tǒng)的流量控制組件,它可以實(shí)現(xiàn)限流與流控及降級(jí)等功能,提高系統(tǒng)的穩(wěn)定性和可靠性,這篇文章主要介紹了Sentinel的初始化流程,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • iBatis習(xí)慣用的16條SQL語(yǔ)句

    iBatis習(xí)慣用的16條SQL語(yǔ)句

    iBatis 是apache 的一個(gè)開(kāi)源項(xiàng)目,一個(gè)O/R Mapping 解決方案,iBatis 最大的特點(diǎn)就是小巧,上手很快.這篇文章主要介紹了iBatis習(xí)慣用的16條SQL語(yǔ)句的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Spring Security OAuth2 實(shí)現(xiàn)登錄互踢的示例代碼

    Spring Security OAuth2 實(shí)現(xiàn)登錄互踢的示例代碼

    這篇文章主要介紹了Spring Security OAuth2實(shí)現(xiàn)登錄互踢的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java使用ByteBuffer進(jìn)行多文件合并和拆分的代碼實(shí)現(xiàn)

    Java使用ByteBuffer進(jìn)行多文件合并和拆分的代碼實(shí)現(xiàn)

    因?yàn)轵?yàn)證證書的需要,需要把證書文件和公鑰給到客戶,考慮到多個(gè)文件交互的不便性,所以決定將2個(gè)文件合并成一個(gè)文件交互給客戶,但是由于是加密文件,采用字符串形式合并后,拆分后文件不可用,本文給大家介紹了Java使用ByteBuffer進(jìn)行多文件合并和拆分,需要的朋友可以參考下
    2024-09-09
  • Java 控制流程、大數(shù)值、數(shù)組

    Java 控制流程、大數(shù)值、數(shù)組

    這篇文章主要給大家介紹的是Java 控制流程、大數(shù)值、數(shù)組的一些相關(guān)自來(lái)哦,感興趣的小伙伴可以參考下面文章的具體內(nèi)容,希望文章對(duì)你有所幫助
    2021-10-10
  • Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘

    Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Springcloud seata nacos環(huán)境搭建過(guò)程圖解

    Springcloud seata nacos環(huán)境搭建過(guò)程圖解

    這篇文章主要介紹了Springcloud seata nacos環(huán)境搭建過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能實(shí)例詳解

    Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能實(shí)例詳解

    這篇文章主要介紹了Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能,較為詳細(xì)的講述了外觀模式的概念、原理并結(jié)合實(shí)例形似詳細(xì)分析了Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-05-05

最新評(píng)論

宣恩县| 新营市| 布拖县| 柯坪县| 从江县| 平谷区| 岗巴县| 军事| 宁阳县| 郯城县| 密云县| 盖州市| 惠安县| 兰溪市| 六安市| 家居| 盘锦市| 满洲里市| 盖州市| 竹北市| 喜德县| 揭东县| 肥乡县| 石渠县| 东明县| 宝坻区| 锦州市| 舞阳县| 龙游县| 台北市| 灵璧县| 遵化市| 瓮安县| 云安县| 深州市| 枞阳县| 兴业县| 安庆市| 丹寨县| 余庆县| 民权县|