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

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). 

外部連結