UML类图五种关系与代码的对应关系
UML類(lèi)圖中的五種關(guān)系的耦合強(qiáng)弱比較:依賴(lài)<關(guān)聯(lián)<聚合<組合<繼承
一、依賴(lài)關(guān)系:
(一)說(shuō)明
虛線(xiàn)+箭頭
可描述為:Uses a
依賴(lài)是類(lèi)的五種關(guān)系中耦合最小的一種關(guān)系。
因?yàn)樵谏纱a的時(shí)候,這兩個(gè)關(guān)系類(lèi)都不會(huì)增加屬性。
(二)依賴(lài)關(guān)系圖與代碼的對(duì)應(yīng)關(guān)系
(PS:依賴(lài)關(guān)系:Animal依賴(lài)于Water(動(dòng)物依賴(lài)于水))
[csharp]?view plaincopyprint?
(三)思考:
Animal類(lèi)如何使用Water類(lèi)呢?或者說(shuō)依賴(lài)關(guān)系到底是如何體現(xiàn)的呢?
1、表現(xiàn)形式1
Water類(lèi)是全局的,則Animal類(lèi)可以調(diào)用它
2、表現(xiàn)形式2
Water類(lèi)是?Animal類(lèi)的某個(gè)方法中的變量,則Animal類(lèi)可以調(diào)用它。
[csharp]?view plaincopyprint?
注意1:?Water類(lèi)的生命期,它是當(dāng)Animal類(lèi)的GrounUp方法被調(diào)用的時(shí)候,才被實(shí)例化。
注意2:持有Water類(lèi)的是Animal的一個(gè)方法而不是Animal類(lèi),這點(diǎn)是最重要的!
3、表現(xiàn)形式3
Water類(lèi)是作為Animal類(lèi)中某個(gè)方法的參數(shù)或者返回值?
[csharp]?view plaincopyprint?
注意: ? Water類(lèi)被Animal類(lèi)的一個(gè)方法持有。生命期隨著方法的執(zhí)行結(jié)束而結(jié)束 。
?
二、關(guān)聯(lián)關(guān)系
(一)說(shuō)明
實(shí)線(xiàn)+箭頭
可描述為:Has a
關(guān)聯(lián)關(guān)系用實(shí)線(xiàn),表示類(lèi)之間的耦合度比依賴(lài)強(qiáng)
在生成代碼的時(shí)候,關(guān)聯(lián)關(guān)系的類(lèi)會(huì)增加屬性。
(二)關(guān)聯(lián)關(guān)系與代碼的對(duì)應(yīng)關(guān)系
? ? ??
? ? ? ? ? ?PS:Water類(lèi)與Climate類(lèi)關(guān)聯(lián)(水與氣候關(guān)聯(lián))。?
[csharp]?view plaincopyprint?
(三)關(guān)聯(lián)關(guān)系的種類(lèi)
關(guān)聯(lián)既有單向關(guān)聯(lián)又有雙向關(guān)聯(lián)。
1、單向關(guān)聯(lián):?Water類(lèi)和Climate類(lèi)單向關(guān)聯(lián)(如下圖),則Water類(lèi)稱(chēng)為源類(lèi),Climate類(lèi)稱(chēng)為目標(biāo)類(lèi)。源類(lèi)了解目標(biāo)類(lèi)的所有的屬性和方法,但目標(biāo)類(lèi)并不了解源類(lèi)的信息。
???? ? ?
2、雙向關(guān)聯(lián):源類(lèi)和目標(biāo)類(lèi)相互了解彼此的信息。如將Water類(lèi)和Climate類(lèi)之間改為雙向關(guān)聯(lián)。
[csharp]?view plaincopyprint?
可見(jiàn)生成的代碼中,兩個(gè)類(lèi)的屬性都添加了!
(四)思考:
依賴(lài)關(guān)系和關(guān)聯(lián)關(guān)系的區(qū)別在哪里?
1、從類(lèi)的屬性是否增加的角度看
??(1)發(fā)生依賴(lài)關(guān)系的兩個(gè)類(lèi)都不會(huì)增加屬性。其中的一個(gè)類(lèi)作為另一個(gè)類(lèi)的方法的參數(shù)或者返回值,或者是某個(gè)方法的變量而已。
??(2)發(fā)生關(guān)聯(lián)關(guān)系的兩個(gè)類(lèi),其中的一個(gè)類(lèi)成為另一個(gè)類(lèi)的屬性,而屬性是一種更為緊密的耦合,更為長(zhǎng)久的持有關(guān)系。
2、從關(guān)系的生命期角度看:
??(1)依賴(lài)關(guān)系是僅當(dāng)類(lèi)的方法被調(diào)用時(shí)而產(chǎn)生,伴隨著方法的結(jié)束而結(jié)束了。
??(2)關(guān)聯(lián)關(guān)系是當(dāng)類(lèi)實(shí)例化的時(shí)候即產(chǎn)生,當(dāng)類(lèi)銷(xiāo)毀的時(shí)候,關(guān)系結(jié)束。相比依賴(lài)講,關(guān)聯(lián)關(guān)系的生存期更長(zhǎng)。
(五)關(guān)聯(lián)關(guān)系的細(xì)化:聚合、組合
1、說(shuō)明
(1)聚合關(guān)系,用空心菱形加箭頭表示
(2)組合關(guān)系,用實(shí)心菱形加箭頭表示,類(lèi)之間的耦合關(guān)系比聚合強(qiáng)!
2、聚合和組合都是關(guān)聯(lián)關(guān)系的一種,到底如何區(qū)分二者呢?
(1)聚合和組合生成的代碼
? ? ? ? ?(PS:此圖表明雁群類(lèi)是由大雁類(lèi)聚合而成)
[csharp]?view plaincopyprint?
? ? ? ? (PS:此圖表明大雁類(lèi)是由翅膀類(lèi)組合而成)
[csharp]?view plaincopyprint?
(2)構(gòu)造函數(shù)不同
? ? ? ? ??聚合類(lèi)的構(gòu)造函數(shù)中包含了另一個(gè)類(lèi)作為參數(shù)。?雁群類(lèi)(GooseGroup)的構(gòu)?造函數(shù)中要用到大雁(Goose)作為參數(shù)傳遞進(jìn)來(lái)。大雁類(lèi)(Goose)可以脫離雁群類(lèi)而獨(dú)立存在。
? ? ? ? ?組合類(lèi)的構(gòu)造函數(shù)中包含了另一個(gè)類(lèi)的實(shí)例化。?表明大雁類(lèi)在實(shí)例化之前,一定要先實(shí)例化翅膀類(lèi)(Wings),這兩個(gè)類(lèi)緊密的耦合在一起,同生共滅。翅膀類(lèi)(Wings)是不可以脫離大雁類(lèi)(Goose)而獨(dú)立存在。
(3)信息的封裝性不同。
? ? ? ? ?在聚合關(guān)系中,客戶(hù)端可以同時(shí)了解雁群類(lèi)和大雁類(lèi),因?yàn)樗麄兌际仟?dú)立的。
? ? ? ? ?在組合關(guān)系中,客戶(hù)端只認(rèn)識(shí)大雁類(lèi),根本就不知道翅膀類(lèi)的存在,因?yàn)槌岚蝾?lèi)被嚴(yán)密的封裝在大雁類(lèi)中。
?
三、泛化
(一)說(shuō)明
實(shí)線(xiàn)+箭頭
可描述為:Is a
泛化也稱(chēng)繼承,子類(lèi)將繼承父類(lèi)的所有屬性和方法,并且可以根據(jù)需要對(duì)父類(lèi)進(jìn)行拓展。
(二)泛化關(guān)系與代碼的對(duì)應(yīng)關(guān)系
(PS:Bird類(lèi)繼承Animal類(lèi),鳥(niǎo)是一種動(dòng)物)
[csharp]?view plaincopyprint?
(三)思考:
1、子類(lèi)繼承父類(lèi),真的是繼承了父類(lèi)的所有屬性和方法嗎?
? ? ??子類(lèi)確實(shí)是繼承了父類(lèi)的所有屬性和方法,只是對(duì)于父類(lèi)的私有類(lèi)型成員沒(méi)有訪(fǎng)問(wèn)權(quán)限!訪(fǎng)問(wèn)就會(huì)報(bào)錯(cuò)!
2、泛化和繼承是一回事兒?jiǎn)?#xff1f;
??????子類(lèi)繼承父類(lèi),父類(lèi)泛化子類(lèi)。?這兩個(gè)詞是從不同的角度來(lái)說(shuō)的!?
3、為什么要多用組合少用繼承?
? ? ? ?繼承和組合各?有優(yōu)缺點(diǎn)。
? ? ? ?類(lèi)繼承是在編譯時(shí)刻靜態(tài)定義的,且可直接使用,類(lèi)繼承可以較方便地改變父類(lèi)的實(shí)現(xiàn)。但是類(lèi)繼承也有一些不足之處。首先,因?yàn)槔^承在編譯時(shí)刻就定義了,所以無(wú)法在運(yùn)行時(shí)刻改變從父類(lèi)繼承的實(shí)現(xiàn)。更糟的是,父類(lèi)通常至少定義了子類(lèi)的部分行為,父類(lèi)的任何改變都可能影響子類(lèi)的行為。如果繼承下來(lái)的實(shí)現(xiàn)不適合解決新的問(wèn)題,則父類(lèi)必須重寫(xiě)或被其他更適合的類(lèi)替換。這種依賴(lài)關(guān)系限制了靈活性并最終限制了復(fù)用性。
? ? ? ??對(duì)象組合是通過(guò)獲得對(duì)其他對(duì)象的引用而在運(yùn)行時(shí)刻動(dòng)態(tài)定義的。由于組合要求對(duì)象具有良好定義的接口,而且,對(duì)象只能通過(guò)接口訪(fǎng)問(wèn),所以我們并不破壞封裝性;只要類(lèi)型一致,運(yùn)行時(shí)刻還可以用一個(gè)對(duì)象來(lái)替代另一個(gè)對(duì)象;更進(jìn)一步,因?yàn)閷?duì)象的實(shí)現(xiàn)是基于接口寫(xiě)的,所以實(shí)現(xiàn)上存在較少的依賴(lài)關(guān)系。
?
四、實(shí)現(xiàn)關(guān)系
? ? ? ?虛線(xiàn)+箭頭
?????(PS:WideGoose類(lèi)實(shí)現(xiàn)IFly接口。大雁實(shí)現(xiàn)飛翔的接口)
[csharp]?view plaincopyprint?
實(shí)現(xiàn)關(guān)系重點(diǎn)理解接口的定義
????接口(interface),接口是一種特殊的抽象類(lèi),這種抽象類(lèi)中只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的UML类图五种关系与代码的对应关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 积存金和黄金的区别,哪个更好?
- 下一篇: 【转】[程序集清单定义与程序集引用不匹配