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

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

生活随笔

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

编程问答

UML类图五种关系与代码的对应关系

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UML类图五种关系与代码的对应关系 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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?
  • Public?class?Animal()??
  • {??
  • ????????Public?Animal(){}??
  • }??
  • ??
  • Public?class?Water()??
  • {??
  • ????????public?Water(){}??
  • }??
  • ? ? ? ? ? 可以看到生成的兩個(gè)類(lèi)的代碼中什么都沒(méi)有添加

    (三)思考:

    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?
  • Public?class?Animal?{??
  • ??????Public?void?Grownup()?{??
  • ???????????????Water?water?=null;??
  • ??????}??
  • }??
  • 注意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?
  • Public?Animal?{??
  • ???Public?Water?Grownup(Waterwater)?{??
  • ??????????????return?null;??
  • ??????}??
  • }??

  • 注意: ? 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?
  • Public?classWater?{??
  • ?????public?Climate?m_Climate;??
  • ?????public?Water(){}??
  • }??
  • ???
  • Public?class?Climate?{??
  • ?????public?Climate()?{}??
  • }??
  • 可見(jiàn)生成的代碼中,Water類(lèi)的屬性中增加了Climate類(lèi)。

    (三)關(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?
  • Public?class?Water?{??
  • ????public?Climate?m_Climate;??
  • ????public?Water(){}??
  • }??
  • Public?class?Climate?{??
  • ????public?Water?m_Water;??
  • ????public?Climate()?{}??
  • }??

  • 可見(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?
  • Public?classGooseGroup?{??
  • ????public?Goose?goose;??
  • ????Public?GooseGroup(Goose?goose)?{??
  • ??????????????this.goose?=?goose;??
  • ???????}??
  • }??
  • ? ??

    ? ? ? ? (PS:此圖表明大雁類(lèi)是由翅膀類(lèi)組合而成)

    [csharp]?view plaincopyprint?
  • Public?classGoose?{??
  • ???public?Wings?wings;??
  • ???public?Goose()?{??
  • ???????wings?=?new?Wings();??
  • ????}??
  • }??
  • 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)系


    PSBird類(lèi)繼承Animal類(lèi),鳥(niǎo)是一種動(dòng)物)

    [csharp]?view plaincopyprint?
  • Class??Bird?:Animal{??
  • }??
  • (三)思考:

    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)+箭頭


    ?????(PSWideGoose類(lèi)實(shí)現(xiàn)IFly接口。大雁實(shí)現(xiàn)飛翔的接口)

    [csharp]?view plaincopyprint?
  • Class?WideGoose:Ifly{???
  • }??
  • 實(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)題。

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