天天看點

圖解UML類與類之間的六中關系

大話設計模式上的一個圖,我用EA畫出來的:

圖解UML類與類之間的六中關系

 依賴關系

dependency

[di'pendənsi]

 關聯關系

association

 [ə,səuʃi'eiʃən]

 聚合關系

aggregation

 [ˌægrɪˈgeɪʃən]

 組合關系

composition

 [,kɔmpə'ziʃən]

 實作

realization

 [,ri:əlɪ'zeɪʃən]

 泛化

generalization

 [,dʒenərəlɪ'zeɪʃən]

關聯:連接配接模型元素及連結執行個體,用一條實線來表示;

依賴:表示一個元素以某種方式依賴于另一個元素,用一條虛線加箭頭來表示;

聚合:表示整體與部分的關系,用一條實線加空心菱形來表示;

組成:表示整體與部分的有一關系,用一條實線加實心菱形來表示;

泛化(繼承):表示一般與特殊的關系,用一條實線加空心箭頭來表示;

實作:表示類與接口的關系,用一條虛線加空心箭頭來表示;

注意:泛化關系和實作關系又統稱為一般關系;

總之:一般關系表現為繼承或實作(is a),關聯關系、聚合關系、合成/組合關系表現為成員變量(has a),依賴關系表現為函數中的參數(use a);

1、關聯關系:

  含義:類與類之間的連結,關聯關系使一個類知道另外一個類的屬性和方法;通常含有“知道”,“了解”的含義

展現:在C#中,關聯關系是通過成員變量來實作的;

方向:雙向或單向;

圖示:實線 + 箭頭;箭頭指向被關聯的類;

舉例:“漁民”需要知道“天氣”情況才能夠出海

   //公司關聯雇員

public class Company

{

    private Employee employee;

    public Employee GetEmployee()

    {

        return employee;

    }

    public void SetEmployee(Employee employee)

        this.employee = employee;

    //公司運作    

    public void Run()

        employee.StartWorking();

}

//A關聯B

class A

    B b = new B();

class B

它展現的是兩個類、或者類與接口之間語義級别的一種強依賴關系,比如我和我的朋友;這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的、關聯可以是單向、雙向的;表現在代碼層面,為被關聯類B以類屬性的形式出現在關聯類A中,也可能是關聯類A引用了一個類型為被關聯類B的全局變量;

2、依賴關系:

  含義:是類與類之間的連接配接,表示一個類依賴于另外一個類的定義;依賴關系僅僅描述了類與類之間的一種使用與被使用的關系;

展現:在C#中展現為局部變量、方法/函數的參數或者是對靜态方法的調用;

方向:單向;

圖示:虛線 + 箭頭;

舉例:人依賴于水和空氣;汽車依賴汽油

    //人劃船,人依賴于船

public class Person

    //劃船

    public void Oarage(Boat boat)

        boat.Oarage();

//A依賴于B

    public void Function(B b)

    { }

可以簡單的了解,就是一個類A使用到了另一個類B,而這種使用關系是具有偶然性的、、臨時性的、非常弱的,但是B類的變化會影響到A;比如某人要過河,需要借用一條船,此時人與船之間的關系就是依賴;表現在代碼層面,為類B作為參數被類A在某個method方法中使用;

3、聚合關系:

  含義:是關聯關系的一種,是一種強關聯關系;聚合關系是整體和個體/部分之間的關系;關聯關系的兩個類處于同一個層次上,而聚合關系的兩個類處于不同的層次上,一個是整體,一個是個體/部分;在聚合關系中,代表個體/部分的對象有可能會被多個代表整體的對象所共享;

展現:C++中,聚合關系通過将被聚合者的(數組)指針作為内部成員來實作的;

圖示:空心菱形 + 實線 + 箭頭;箭頭指向被聚合的類,也就是說,箭頭指向個體/部分;

舉例:鴨群與鴨子具有聚合關系;汽車由引擎、輪胎以及其它零件組成,因為汽車壞掉了,沒有壞掉的引擎,輪胎和其他零件還可以繼續使用。

聚合是關聯關系的一種特例,他展現的是整體與部分、擁有的關系,即has-a的關系,此時整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享;比如計算機與CPU、公司與員工的關系等;表現在代碼層面,和關聯關系是一緻的,隻能從語義級别來區分;

4、組合關系:

  含義:它也是關聯關系的一種,但它是比聚合關系更強的關系.組合關系要求聚合關系中代表整體的對象要負責代表個體/部分的對象的整個生命周期;組合關系不能共享;在組合關系中,如果代表整體的對象被銷毀或破壞,那麼代表個體/部分的對象也一定會被銷毀或破壞,而聚在合關系中,代表個體/部分的對象則有可能被多個代表整體的對象所共享,而不一定會随着某個代表整體的對象被銷毀或破壞而被銷毀或破壞;

展現:在C#中,組合關系是通過成員變量來實作的;

圖示:實心菱形 + 實線 + 箭頭;箭頭指向代表個體/部分的對象,也就是被組合的類的對象;

舉例:一個人由頭、四肢、等各種器官組成,因為人與這些器官具有相同的生命周期,人死了,這些器官也挂了;

組合也是關聯關系的一種特例,他展現的是一種contains-a的關系,這種關系比聚合更強,也稱為強聚合;他同樣展現整體與部分間的關系,但此時整體與部分是不可分的,整體的生命周期結束也就意味着部分的生命周期結束;比如你和你的大腦;表現在代碼層面,和關聯關系是一緻的,隻能從語義級别來區分;

5、泛化關系:

  含義:它表示一個更泛化的元素和一個更具體的元素之間的關系;也就是通常所說的類的繼承關系;

展現:在C#中,泛化關系通過類的繼承來實作的;

方向:單向;子類繼承父類;

圖示:空心箭頭 + 實線;箭頭指向父類;

舉例:動物下面可以分為哺乳動物,脊椎動物,爬行動物等

指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關系;在Java中此類關系通過關鍵字extends明确辨別,在設計時一般沒有争議性;

6、實作關系:

  含義:它指定了兩個實體之間的一份合同;即:一個實體定義一份合同,另外一個實體則保證履行該合同;

展現:在C#中,實作關系通過類實作接口來實作的,即:一個類實作某個接口;

方向:單向;子類實作接口;

圖示:空心箭頭 + 虛線;箭頭指接口向接口;

舉例:唐老鴨(對象)會說話(接口),因為一般鴨子不會說話,是以不會将說話這個方法給一般的鴨子帶上;超人(對象)會飛(接口)

指的是一個class類實作interface接口(可以是多個)的功能;實作是類與接口之間最常見的關系;在Java中此類關系通過關鍵字implements明确辨別,在設計時一般沒有争議性;

總結:對于繼承、實作這兩種關系沒多少疑問,他們展現的是一種類與類、或者類與接口間的縱向關系;其他的四者關系則展現的是類與類、或者類與接口間的引用、橫向關系,是比較難區分的,有很多事物間的關系要想準備定位是很難的,前面也提到,這幾種關系都是語義級别的,是以從代碼層面并不能完全區分各種關系;但總的來說,後幾種關系所表現的強弱程度依次為:組合>聚合>關聯>依賴。