類別圖是軟件工程的統一建模語言一種靜態結構圖,該圖描述了系統的類別集合,類別的屬性和類別之間的關係。

UML 2.0 Diagrams

概述

類別圖是物件導向式的建模。他們一般都被用於概念建模(conceptual modelling)的系統分類的應用程式,並可將模型建模轉譯成程式碼。

 
一個類別有三個區域
  • 最上面是類別名稱
  • 中間部分包含類別的屬性
  • 底部部分包含類別的方法

為了進一步描述系統的行為,這些類圖可以輔之以狀態圖或UML狀態機。

成員

UML提供機制,以代表類的成員,如屬性和方法,對他們的其他資訊。

指定一個類成員(即任何屬性或方法)的可見性有下列符號,必須擺在各成員的名字之前:

+   公共
-   私有
#   保護(即對子類可見)
~   包(即對包内其他成員可見)

關係

 

實例層級的關係

外部連結

外部連結(External links)是物件之間的基本關係。

泛化

泛化(Generalization),即繼承的反方向,指的是一個類別(稱為父類別、父介面)具有另外的一個(或一些)類別(稱為子類別、子介面)的共有功能。子類別可視為其父類別的特例,並可以增加新功能。用帶空心三角形箭頭的實線表示。

實現

實現(Realization)指的是一個class類別實現interface介面(可以是多個)的功能;在Java中此類別關係通過關鍵字implements明確標識。用帶空心三角形箭頭的虛線表示。

依賴

依賴關係(Dependency)可以簡單的理解為一個類別A使用到了另一個類別B," ... uses a ...",被依賴的對象只是作為一種工具在使用,而並不持有對它的參照。而這種使用關係是具有偶然性、臨時性的、非常弱的,但是B類別的變化會影響到A;表現在代碼層面,為類別B作為參數被類別A在某個method(方法)中使用。用帶燕尾箭頭的虛線表示。表示一個類別依賴於另外一個類別的定義;依賴關係僅僅描述了類別與類別之間的一種使用與被使用的關係。

關聯

 
人與雜誌是一種關聯

一個關聯(Association)代表一個家族的聯繫。關聯可以命名,可以飾以角色名稱,有權指標,多重性,可視性,以及其他屬性(如相互關聯和有方向的(帶燕尾箭頭的實線表示)關聯)。在語意上是兩個類別之間、或類別與介面之間一種強依賴關係,是一種長期的穩定的關係," ... has a ..." 。關聯關係使一個類別知道另外一個類別的屬性和方法;通常含有「知道」、「了解」的含義。某個對象會長期的持有另一個對象的參照,關聯的兩個對象彼此間沒有任何強制性的約束,只要二者同意,可以隨時解除關係或是進行關聯,它們在生命期問題上沒有任何約定。被關聯的對象還可以再被別的對象關聯,所以關聯是可以共用的。 在代碼層面上,被關聯類別以類別屬性的形式出現在關聯類別中,也可能是關聯類別參照了一個類別型為被關聯類別的全域變數。目前定義有五種不同類型的關聯。雙向(Bi-directional)和單向(uni-directional)的關聯是最常見的。

 
Class diagram showing Aggregation between two classes

聚合

聚合(Aggregate)是表示整體與部分的一類別特殊的關聯關係,是「弱」的包含(" ... owns a ..." )關係,成分類別可以不依靠聚合類別而單獨存在,可以具有各自的生命周期,部分可以屬於多個整體對象,也可以為多個整體對象共用(sharable)。例如,池塘與(池塘中的)鴨子。再例如教授課程就是一種聚合關係。又例如圖書館包含(owns a) 學生和書籍。即使沒有圖書館,學生亦可以存在,學生和圖書館之間的關係是聚集。聚集可能不涉及兩個以上的類別。圖形以空心的菱形箭尾與實線來表示。

// Aggregation
class Pond
{
private:
   std::vector<Duck*> ducks;
};

組成

組成(Composition)關係,是一類別「強」的整體與部分的包含關係(" ... is a part of ...")。成分類別必須依靠合成類別而存在。整體與部分是不可分的,整體的生命周期結束也就意味着部分的生命周期結束。合成類別別完全擁有成分類別別,負責建立、銷毀成分類別別。例如汽車與化油器,又例如公司與公司部門就是一種組成關係。圖形以實心的菱形箭尾與實線表示。

// Composition
class Car
{
private:

    // Car is the owner of carburetor.
    // Carburetor is created when Car is created,
    // it is destroyed when Car is destroyed.
    Carburetor carb;

};

關聯、組成和聚集之差異

當一個類別作為另一個類別某個方法的參數時,為關聯。[需要較佳來源]

兩者的差別主要描述了子類別的生命周期的不同。組合關係中,一旦父類別被銷毀子類別也會隨之銷毀;聚合關係中,子類別的生命周期與父類別獨立。[1]例如,一個大學包含若干個系(如化學系),每個係由若干名教授。如果大學復原,這些系也就不復存在了,但這些教授仍會繼續存在。還需注意,一名教授可以在不同系甚至不同學校兼職,而一個系不能屬於兩所大學。所以,大學與系之間是組成關係,而系與教授是聚合關係。  

類別層級的關係

概括

概括(Generalization),是指類別與類別之間的共通性,通常會具有繼承(inherit)的關係。圖形以實線和空心箭頭來表示。

實現

UML建模時,一個實現(realization)關係是兩個模型元素之間的關係,其中一個模型元素(客戶端)實現的行為,其他模型元素(供應商)指定。圖形以虛線和空心箭頭來表示。

一般關係

依賴

 
"Car" 與 "Wheel" 是一種弱化的依賴

依賴(Dependency)是一種弱化形式的關係,表示一類別依賴於另外的類別,因為類別在某個時間點使用另一個類別。

多重

關聯多重性(Multiplicity)是用來定義參與物件數量,每個參與類別都必須指定多重性值,例如class A會有多少個instance與class B的多少個instance關連在一起,在現實生活中,一個汽車駕駛與汽車個數就是多重關係,可以是一對多,或是多對多。

參考文獻

  1. ^ UML 基础: 类图. [2012-02-20]. (原始內容存檔於2016-03-04). 

外部連結