初次接觸UML的時候,就對比過類圖中的幾種關係(UML——類圖),當時側重的是對這些關係的通俗理解,忽略了圖和程式碼的對應關係。現在在軟考中設計模式也是很重要的一部分,基本考點就是將UML圖轉化成程式碼實現,前兩天聽了王聚師哥的講解,有一種茅塞頓開的感覺。

c#版UML類圖中五大關係和程式碼的對應:

1.實現

    實現通常描述的是類和介面的關係,一般都說什麼類實現了什麼介面。比如說下圖中大雁類實現了飛翔介面。


程式碼實現:

//將圖轉換成程式碼:“類名:介面名”
class WideGoose: IFly
{

}
2.繼承

    在UML圖中,準確的說繼承應該是泛化,我們都知道繼承和泛化都表示的是子類的父類的關係,但是也有微弱的區別,只是看問題的角度不同,一般都是子類繼承父類,父類泛化子類。比如說下圖中動物和鳥的關係:鳥類繼承了動物類,而動物類泛化出鳥類。


程式碼實現

//圖和程式碼的對應關係:“子類:父類”
class Bird : Animal
{

}

    可以看出繼承和實現在程式碼中都是通過“:”來表示,我們也很容易理解。

3.關聯

    我們都知道關聯又可以分為聚合,組合,他們的主要區別體現在類和類之間關聯的強度。首先從最簡單的關聯關係說起:


    當一個類知道另一個類時,可以用關聯關係。現在企鵝需要知道氣候的變化,瞭解氣候的變化規律。在圖中我們用實線+箭頭來表示,企鵝類和氣候物件是一種一對一的關係,所以在程式碼中的體現為:在企鵝類中引用箭頭指向的氣候物件

class Penguin 
{   
      //在企鵝類中,引用氣候物件。
      private Climate climate;
}
3.1 聚合


    聚合表示了一種弱的擁有關係,一個雁群可以擁有多個大雁,所以在雁群類中,就需要引用大雁的陣列物件。

class WideGooseAggregate
{
       //在雁群類中,引用大雁陣列物件
       private WideGoose() arrayWideGoose;
}
3.2 組合

    組合是一種強的擁有關係,部分和整體必須同生死共存亡,也就是具有同樣的生命週期。翅膀脫離了鳥不可能單獨存在,鳥也不能沒有翅膀。

class Bird
{ 
       //1.在鳥類中引用翅膀物件
       Private Wing wing;
       //2.在鳥類的建構函式中,初始化鳥類的同時也要例項化翅膀,
       //因為他們同時生成,也就是翅膀的變化會影響鳥的變化,
        Public Bird( )
        {
              wing = new Wing( );
        }
       
}
    對比關聯,聚合和組合的程式碼實現過程:關聯只需要引用一個單獨的物件,而聚合需要引用一個數組物件,組合除了需要引用物件外,還需要在一個類中初始化箭頭指向的類。