五種關(guān)系的耦合強弱比較:依賴<關(guān)聯(lián)<聚合<組合<繼承
一、依賴關(guān)系:
慈溪網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
1.說明:虛線+剪頭,可描述為Use a
依賴是類的5種關(guān)系中耦合最小的一種關(guān)系,因為在生成代碼的時候,這兩個關(guān)系類都不會增加屬性
2.依賴關(guān)系圖與代碼的對應(yīng)關(guān)系
- Public class Animal()
- {
- Public Animal(){}
- }
-
- Public class Water()
- {
- public Water(){}
- }
可以看到生成的兩個類的代碼中什么都沒有添加
3.思考
Animal類是如何使用Water類的呢?或者說依賴關(guān)系到底是如何體現(xiàn)的呢?
-
water類是全局的,則animal類可以調(diào)用它
-
water類是animal類的某個方法中的變量,則animal類可以調(diào)用它
- Public class Animal {
- Public void Grownup() {
- Water water =null;
- }
- }
注意1:water類的生命后期,它是當(dāng)animal類的grounUp類方法被調(diào)用時才被實例化
注意2:持有water類的是animal的一個方法而不是animal類
-
water類是作為animal類中某個方法的參數(shù)或者返回值
- Public Animal {
- Public Water Grownup(Waterwater) {
- return null;
- }
- }
二、關(guān)聯(lián)關(guān)系
1.說明:
實線+箭頭 可以描述為has a
關(guān)聯(lián)關(guān)系用實線,表示類之間的耦合度比依賴強。在生成代碼的時候,關(guān)聯(lián)關(guān)系的類會增加屬性
2.關(guān)聯(lián)關(guān)系和代碼的對應(yīng)關(guān)系
- Public class Water {
- public Climate m_Climate;
- public Water(){}
- }
-
- Public class Climate {
- public Climate() {}
- }
可見,生成的代碼中,water類的屬性中增加了Climate類
3.關(guān)聯(lián)的種類
關(guān)聯(lián)有單向關(guān)聯(lián)和雙向關(guān)聯(lián)
單向關(guān)聯(lián):water類和Climate類單向關(guān)聯(lián),則water類稱為源類,Climate類稱為目標類。源類了解目標類的所有屬性和方法,但目標類并不了解類的信息
雙向關(guān)聯(lián):源類和目標類互相了解彼此的信息,如將water類和Climate類之間改為雙向關(guān)聯(lián)
- Public class Water {
- public Climate m_Climate;
- public Water(){}
- }
- Public class Climate {
- public Water m_Water;
- public Climate() {}
- }
可見,生成的代碼中,兩個類的屬性都添加了
4.思考:
依賴關(guān)聯(lián)和關(guān)聯(lián)關(guān)系的區(qū)別在哪里?
(1)從類的屬性是否增加的角度看:
發(fā)生依賴關(guān)系的兩個類都不會增加屬性,其中的一個類作為另一個類的方法的參數(shù)或者返回值,或者是某個方法的變量而已。
發(fā)生關(guān)聯(lián)關(guān)系的兩個類,其中的一個類稱為另一個類的屬性,而屬性是一種更為緊密的耦合,更為長久的持有關(guān)系。
(2)從關(guān)系的生命周期角度看:
依賴關(guān)系是僅當(dāng)類的方法被調(diào)用時而產(chǎn)生的,伴隨著方法的結(jié)束而結(jié)束了。
關(guān)聯(lián)關(guān)系是當(dāng)類實例化的時候即產(chǎn)生,當(dāng)類銷毀的時候,關(guān)系結(jié)束。相對依賴來說,關(guān)聯(lián)關(guān)系的生存周期更長
5.關(guān)聯(lián)關(guān)系的細化:聚合和組合
(1)聚合:用空心菱形+箭頭
組合:用實心菱形+箭頭,類之間的耦合比聚合強
(2)聚合和組合生成的代碼
(PS:此圖表明雁群類是由大雁類聚合而成)
- Public class GooseGroup {
- public Goose goose;
- Public GooseGroup(Goose goose) {
- this.goose = goose;
- }
- }
(PS:此圖表明大雁類是由翅膀類組合而成)
- Public class Goose {
- public Wings wings;
- public Goose() {
- wings = new Wings();
- }
- }
(3)構(gòu)造函數(shù)不同
聚合類的構(gòu)造函數(shù)中包含了另外一個類作為參數(shù),GooseGroup的構(gòu)造函數(shù)中用到Goose作為參數(shù)傳遞進來,Goose可以脫離GooseGroup獨立存在
組合類的構(gòu)造函數(shù)中包含了一個類的實例化,表明大雁類在實例化之前,一定要先實例化Wings類,這兩個類緊密的耦合在一起,同生共滅。wings類是不可以脫離大雁類獨立存在的
(4)信息的封裝性不同
聚合關(guān)系中,客戶端可以同時了解GooseGroup和大雁類,因為他們是獨立的
在組合關(guān)系中,客戶端只認識大雁類,根本就不知道wings類的存在,因為wings類被封裝在Goose類中
三、泛化
1.說明:
實線+箭頭 可描述為is a
泛化也成繼承,子類將繼承父類的所有屬性和方法,并且可以根據(jù)需要對父類進行擴展
2.泛化關(guān)系與代碼的對應(yīng)關(guān)系
PS:Bird類繼承了animal類
- Class Bird :Animal{
- }
3.思考:
(1)子類繼承父類,真的是繼承了父類的所有屬性和方法嗎?
子類確實繼承了父類的所有屬性和方法,只是對于父類的私有類型成員沒有訪問權(quán)限
(2)泛化和繼承是一回事嗎?
子類繼承父類,父類泛化子類,不同角度來解釋而已
(3)為什么藥多用組合少用繼承?
組合和繼承各有優(yōu)缺點。
類繼承是在編譯時刻靜態(tài)定義的,且可直接使用,類繼承可以較方便的改變父類的實現(xiàn),但是類繼承也有一些不之處。首先,因為繼承在編譯時刻就定義了,所以無法再運行時刻改變父類繼承的實現(xiàn)。更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可以影響子類的行為,如果繼承下來的實現(xiàn)不適合解決新的問題,則父類必須重寫或被其他更適合的替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性。
組合是通過獲取對其他對象的引用而在運行時刻動態(tài)定義的,由于組合要求具有良好定義的接口,而且,對象只能通過接口訪問,所以我們并不破壞封裝性;只要類型一致,運行時刻還可以用一個對象來替代另一個對象;更進一步,因為對象的實現(xiàn)是基于接口寫的,所以實現(xiàn)上存在較少的依賴關(guān)系。
四、實現(xiàn)
1.說明:
虛線+箭頭
PS:Win的Goose類實現(xiàn)IFly接口
- Class WideGoose:Ifly{
- }
2.接口的定義:
是一種特殊的抽象類,這種抽象類中值包含常量和方法的定義,而沒有變量和方法的實現(xiàn)
網(wǎng)頁標題:UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系
本文URL:http://www.rwnh.cn/article24/jcjpce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、微信小程序、電子商務(wù)、企業(yè)網(wǎng)站制作、網(wǎng)頁設(shè)計公司、服務(wù)器托管
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源:
創(chuàng)新互聯(lián)