日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

谈一谈自己对依赖、关联、聚合和组合之间区别的理解

發(fā)布時(shí)間:2023/12/2 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谈一谈自己对依赖、关联、聚合和组合之间区别的理解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在學(xué)習(xí)面向?qū)ο笤O(shè)計(jì)對(duì)象關(guān)系時(shí),依賴(lài)、關(guān)聯(lián)、聚合和組合這四種關(guān)系之間區(qū)別比較容易混淆。特別是后三種,僅僅是在語(yǔ)義上有所區(qū)別,所謂語(yǔ)義就是指上下文環(huán)境、特定情景等。他們?cè)诰幊陶Z(yǔ)言中的體現(xiàn)卻是基本相同的,但是基本相同并不等于完全相同,這一點(diǎn)在我的前一篇博文《設(shè)計(jì)模式中類(lèi)的關(guān)系》中已經(jīng)有所提及,下面就來(lái)詳細(xì)的論述一下在Java中如何準(zhǔn)確的體現(xiàn)依賴(lài)、關(guān)聯(lián)、聚合和組合。

首先看一看書(shū)上對(duì)這四種關(guān)系的定義:

  • 依賴(lài)(Dependency)關(guān)系是類(lèi)與類(lèi)之間的聯(lián)接。依賴(lài)關(guān)系表示一個(gè)類(lèi)依賴(lài)于另一個(gè)類(lèi)的定義。例如,一個(gè)人(Person)可以買(mǎi)車(chē)(car)和房子(House),Person類(lèi)依賴(lài)于Car類(lèi)和House類(lèi)的定義,因?yàn)镻erson類(lèi)引用了Car和House。與關(guān)聯(lián)不同的是,Person類(lèi)里并沒(méi)有Car和House類(lèi)型的屬性,Car和House的實(shí)例是以參量的方式傳入到buy()方法中去的。一般而言,依賴(lài)關(guān)系在Java語(yǔ)言中體現(xiàn)為局域變量、方法的形參,或者對(duì)靜態(tài)方法的調(diào)用。
  • 關(guān)聯(lián)(Association)關(guān)系是類(lèi)與類(lèi)之間的聯(lián)接,它使一個(gè)類(lèi)知道另一個(gè)類(lèi)的屬性和方法。關(guān)聯(lián)可以是雙向的,也可以是單向的。在Java語(yǔ)言中,關(guān)聯(lián)關(guān)系一般使用成員變量來(lái)實(shí)現(xiàn)。
  • ?聚合(Aggregation) 關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系。聚合是整體和個(gè)體之間的關(guān)系。例如,汽車(chē)類(lèi)與引擎類(lèi)、輪胎類(lèi),以及其它的零件類(lèi)之間的關(guān)系便整體和個(gè)體的關(guān)系。與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過(guò)實(shí)例變量實(shí)現(xiàn)的。但是關(guān)聯(lián)關(guān)系所涉及的兩個(gè)類(lèi)是處在同一層次上的,而在聚合關(guān)系中,兩個(gè)類(lèi)是處在不平等層次上的,一個(gè)代表整體,另一個(gè)代表部分。
  • ?組合(Composition) 關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系強(qiáng)的關(guān)系。它要求普通的聚合關(guān)系中代表整體的對(duì)象負(fù)責(zé)代表部分對(duì)象的生命周期,組合關(guān)系是不能共享的。代表整體的對(duì)象需要負(fù)責(zé)保持部分對(duì)象和存活,在一些情況下將負(fù)責(zé)代表部分的對(duì)象湮滅掉。代表整體的對(duì)象可以將代表部分的對(duì)象傳遞給另一個(gè)對(duì)象,由后者負(fù)責(zé)此對(duì)象的生命周期。換言之,代表部分的對(duì)象在每一個(gè)時(shí)刻只能與一個(gè)對(duì)象發(fā)生組合關(guān)系,由后者排他地負(fù)責(zé)生命周期。部分和整體的生命周期一樣。

——摘自《Java面向?qū)ο缶幊獭?#xff0c;作者:孫衛(wèi)琴

???????以上關(guān)系的耦合度依次增強(qiáng)(關(guān)于耦合度的概念將在以后具體討論,這里可以暫時(shí)理解為當(dāng)一個(gè)類(lèi)發(fā)生變更時(shí),對(duì)其他類(lèi)造成的影響程度,影響越小則耦合度越弱,影響越大耦合度越強(qiáng))。由定義我們已經(jīng)知道,依賴(lài)關(guān)系實(shí)際上是一種比較弱的關(guān)聯(lián),聚合是一種比較強(qiáng)的關(guān)聯(lián),而組合則是一種更強(qiáng)的關(guān)聯(lián),所以籠統(tǒng)的來(lái)區(qū)分的話,實(shí)際上這四種關(guān)系、都是關(guān)聯(lián)關(guān)系。

??????? 依賴(lài)關(guān)系比較好區(qū)分,它是耦合度最弱的一種,在java中表現(xiàn)為局域變量、方法的形參,或者對(duì)靜態(tài)方法的調(diào)用,如下面的例子:Driver類(lèi)依賴(lài)于Car類(lèi),Driver的三個(gè)方法分別演示了依賴(lài)關(guān)系的三種不同形式。

[java]?view plaincopy
  • class?Car?{??
  • ????public?static?void?run(){??
  • ????????System.out.println("汽車(chē)在奔跑");??
  • ????}??
  • }??
  • ??
  • class?Driver?{??
  • ????//使用形參方式發(fā)生依賴(lài)關(guān)系??
  • ????public?void?drive1(Car?car){??
  • ????????car.run();??
  • ????}??
  • ????//使用局部變量發(fā)生依賴(lài)關(guān)系??
  • ????public?void?drive2(){??
  • ????????Car?car?=?new?Car();??
  • ????????car.run();??
  • ????}??
  • ????//使用靜態(tài)變量發(fā)生依賴(lài)關(guān)系??
  • ????public?void?drive3(){??
  • ????????Car.run();??
  • ????}??
  • }??
  • ??????? 關(guān)聯(lián)關(guān)系在java中一般使用成員變量來(lái)實(shí)現(xiàn),有時(shí)也用方法形參的形式實(shí)現(xiàn)。依然使用Driver和Car的例子,使用方法參數(shù)形式可以表示依賴(lài)關(guān)系,也可以表示關(guān)聯(lián)關(guān)系,畢竟我們無(wú)法在程序中太準(zhǔn)確的表達(dá)語(yǔ)義。在本例中,使用成員變量表達(dá)這個(gè)意思:車(chē)是我自己的車(chē),我“擁有”這個(gè)車(chē)。使用方法參數(shù)表達(dá):車(chē)不是我的,我只是個(gè)司機(jī),別人給我什么車(chē)我就開(kāi)什么車(chē),我使用這個(gè)車(chē)。

    [java]?view plaincopy
  • class?Driver?{??
  • ????//使用成員變量形式實(shí)現(xiàn)關(guān)聯(lián)??
  • ????Car?mycar;??
  • ????public?void?drive(){??
  • ????????mycar.run();??
  • ????}??
  • ????...??
  • ????//使用方法參數(shù)形式實(shí)現(xiàn)關(guān)聯(lián)??
  • ????public?void?drive(Car?car){??
  • ????????car.run();??
  • ????}??
  • }??
  • ??????? 聚合關(guān)系是是一種比較強(qiáng)的關(guān)聯(lián)關(guān)系,java中一般使用成員變量形式實(shí)現(xiàn)。對(duì)象之間存在著整體與部分的關(guān)系。例如上例中

    [java]?view plaincopy
  • class?Driver?{??
  • ????//使用成員變量形式實(shí)現(xiàn)聚合關(guān)系??
  • ????Car?mycar;??
  • ????public?void?drive(){??
  • ????????mycar.run();??
  • ????}??
  • }??

  • ??????? 假如給上面代碼賦予如下語(yǔ)義:車(chē)是一輛私家車(chē),是司機(jī)財(cái)產(chǎn)的一部分。則相同的代碼即表示聚合關(guān)系了。聚合關(guān)系一般使用setter方法給成員變量賦值。

    假如賦予如下語(yǔ)義:車(chē)是司機(jī)的必須有的財(cái)產(chǎn),要想成為一個(gè)司機(jī)必須要先有輛車(chē),車(chē)要是沒(méi)了,司機(jī)也不想活了。而且司機(jī)要是不干司機(jī)了,這個(gè)車(chē)就砸了,別人誰(shuí)也別想用。那就表示組合關(guān)系了。一般來(lái)說(shuō),為了表示組合關(guān)系,常常會(huì)使用構(gòu)造方法來(lái)達(dá)到初始化的目的,例如上例中,加上一個(gè)以Car為參數(shù)的構(gòu)造方法

    [java]?view plaincopy
  • public?Driver(Car?car){??
  • ????mycar?=?car;??
  • }??

  • ??????? 所以,關(guān)聯(lián)、聚合、組合只能配合語(yǔ)義,結(jié)合上下文才能夠判斷出來(lái),而只給出一段代碼讓我們判斷是關(guān)聯(lián),聚合,還是組合關(guān)系,則是無(wú)法判斷的。

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的谈一谈自己对依赖、关联、聚合和组合之间区别的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。