溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系

發(fā)布時間:2020-08-08 12:37:11 來源:ITPUB博客 閱讀:253 作者:634828354 欄目:建站服務(wù)器

五種關(guān)系的耦合強(qiáng)弱比較:依賴<關(guān)聯(lián)<聚合<組合<繼承
一、依賴關(guān)系:

        1.說明:虛線+剪頭,可描述為Use a        
         
依賴是類的5種關(guān)系中耦合最小的一種關(guān)系,因?yàn)樵谏纱a的時候,這兩個關(guān)系類都不會增加屬性
        2.依賴關(guān)系圖與代碼的對應(yīng)關(guān)系
        UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系
  1. Public class Animal()  
  2. {  
  3.         Public Animal(){}  
  4. }  
  5.   
  6. Public class Water()  
  7. {  
  8.         public Water(){}  
  9. }  
        可以看到生成的兩個類的代碼中什么都沒有添加
        3.思考
        Animal類是如何使用Water類的呢?或者說依賴關(guān)系到底是如何體現(xiàn)的呢?

  • water類是全局的,則animal類可以調(diào)用它
  • water類是animal類的某個方法中的變量,則animal類可以調(diào)用它
  1. Public class Animal {  
  2.       Public void Grownup() {  
  3.                Water water =null;  
  4.       }  
  5. }  
        注意1:water類的生命后期,它是當(dāng)animal類的grounUp類方法被調(diào)用時才被實(shí)例化
        注意2:持有water類的是animal的一個方法而不是animal類
  • water類是作為animal類中某個方法的參數(shù)或者返回值
  1. Public Animal {  
  2.    Public Water Grownup(Waterwater) {  
  3.               return null;  
  4.       }  
  5. }  
二、關(guān)聯(lián)關(guān)系
        1.說明:
        實(shí)線+箭頭 可以描述為has a
        關(guān)聯(lián)關(guān)系用實(shí)線,表示類之間的耦合度比依賴強(qiáng)。在生成代碼的時候,關(guān)聯(lián)關(guān)系的類會增加屬性
        2.關(guān)聯(lián)關(guān)系和代碼的對應(yīng)關(guān)系
        
UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系        
  1. Public class Water {  
  2.      public Climate m_Climate;  
  3.      public Water(){}  
  4. }  
  5.    
  6. Public class Climate {  
  7.      public Climate() {}  
  8. }  
        可見,生成的代碼中,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類稱為目標(biāo)類。源類了解目標(biāo)類的所有屬性和方法,但目標(biāo)類并不了解類的信息
        UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系
        雙向關(guān)聯(lián):源類和目標(biāo)類互相了解彼此的信息,如將water類和Climate類之間改為雙向關(guān)聯(lián)
        UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系        
  1. Public class Water {  
  2.     public Climate m_Climate;  
  3.     public Water(){}  
  4. }  
  5. Public class Climate {  
  6.     public Water m_Water;  
  7.     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)類實(shí)例化的時候即產(chǎn)生,當(dāng)類銷毀的時候,關(guān)系結(jié)束。相對依賴來說,關(guān)聯(lián)關(guān)系的生存周期更長
        5.關(guān)聯(lián)關(guān)系的細(xì)化:聚合和組合
        (1)聚合:用空心菱形+箭頭
                組合:用實(shí)心菱形+箭頭,類之間的耦合比聚合強(qiáng)
        (2)聚合和組合生成的代碼
            UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系        
            (PS:此圖表明雁群類是由大雁類聚合而成)
  1. Public class GooseGroup {  
  2.     public Goose goose;  
  3.     Public GooseGroup(Goose goose) {  
  4.               this.goose = goose;  
  5.        }  
  6. }  

        UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系
            (PS:此圖表明大雁類是由翅膀類組合而成)            
  1. Public class Goose {  
  2.    public Wings wings;  
  3.    public Goose() {  
  4.        wings = new Wings();  
  5.     }  
  6. }  
        (3)構(gòu)造函數(shù)不同
             聚合類的構(gòu)造函數(shù)中包含了另外一個類作為參數(shù),GooseGroup的構(gòu)造函數(shù)中用到Goose作為參數(shù)傳遞進(jìn)來,Goose可以脫離GooseGroup獨(dú)立存在
            組合類的構(gòu)造函數(shù)中包含了一個類的實(shí)例化,表明大雁類在實(shí)例化之前,一定要先實(shí)例化Wings類,這兩個類緊密的耦合在一起,同生共滅。wings類是不可以脫離大雁類獨(dú)立存在的
       (4)信息的封裝性不同
            聚合關(guān)系中,客戶端可以同時了解GooseGroup和大雁類,因?yàn)樗麄兪仟?dú)立的
            在組合關(guān)系中,客戶端只認(rèn)識大雁類,根本就不知道wings類的存在,因?yàn)閣ings類被封裝在Goose類中
三、泛化
    1.說明:
        實(shí)線+箭頭 可描述為is a
        泛化也成繼承,子類將繼承父類的所有屬性和方法,并且可以根據(jù)需要對父類進(jìn)行擴(kuò)展
    2.泛化關(guān)系與代碼的對應(yīng)關(guān)系
        UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系
        PS:Bird類繼承了animal類
  1. Class  Bird :Animal{  
  2. }  
    3.思考:
        (1)子類繼承父類,真的是繼承了父類的所有屬性和方法嗎?
            子類確實(shí)繼承了父類的所有屬性和方法,只是對于父類的私有類型成員沒有訪問權(quán)限
        (2)泛化和繼承是一回事嗎?
            子類繼承父類,父類泛化子類,不同角度來解釋而已
        (3)為什么藥多用組合少用繼承?
            組合和繼承各有優(yōu)缺點(diǎn)。
            類繼承是在編譯時刻靜態(tài)定義的,且可直接使用,類繼承可以較方便的改變父類的實(shí)現(xiàn),但是類繼承也有一些不之處。首先,因?yàn)槔^承在編譯時刻就定義了,所以無法再運(yùn)行時刻改變父類繼承的實(shí)現(xiàn)。更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可以影響子類的行為,如果繼承下來的實(shí)現(xiàn)不適合解決新的問題,則父類必須重寫或被其他更適合的替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性。
            組合是通過獲取對其他對象的引用而在運(yùn)行時刻動態(tài)定義的,由于組合要求具有良好定義的接口,而且,對象只能通過接口訪問,所以我們并不破壞封裝性;只要類型一致,運(yùn)行時刻還可以用一個對象來替代另一個對象;更進(jìn)一步,因?yàn)閷ο蟮膶?shí)現(xiàn)是基于接口寫的,所以實(shí)現(xiàn)上存在較少的依賴關(guān)系。
四、實(shí)現(xiàn)
    1.說明:
        虛線+箭頭
        UML類圖五種關(guān)系與代碼的對應(yīng)關(guān)系
        PS:Win的Goose類實(shí)現(xiàn)IFly接口
  1. Class WideGoose:Ifly{   
  2. }
    2.接口的定義:
        是一種特殊的抽象類,這種抽象類中值包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn)
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI