類別圖

參考資料:(https://zh.wikipedia.org/wiki/%E9%A1%9E%E5%88%A5%E5%9C%96)

參考資料:(http://www.codedata.com.tw/java/umltutorial-02/)

類別名稱區隔

圖型都是長方形(有些比較特別的,介面會用圓形代替)

類別 直接呈現

抽象類別 右下角 {abstract}

介面 上方 << interface >>

UML制定了許多 Stereotypes "<< >>",EX: << interface >>

屬性區隔

< 存取範圍 > < 屬性名稱 > [ [ < 數量 > ] [ < 順序性 > ] ] : < 型態 > [ = < 初始值 > ]

可見性、存取範圍

+    public
-    private
#    protect
~    package
/    推導(可由其他屬性推導得出)
_    靜態

屬性名稱

使用Java程式語言中合法的識別字

數量和順序性

數字 : 確定的數量

  • : 0到多個

    0..* : 0到多個

    0..1 : 0到1個

    1..* : 1到多個

    n..m : 最少n個,最多m個

當屬性的數量是一個以上的時候,你可以使用順序性的宣告來表示這個屬性的值是否需要排序

Unordered : 不需要排序 Ordered : 需要排序

型態

屬性的資料型態,使用八種基本資料型態或類別名稱

初始值

可選擇性地宣告,為屬性宣告一個合法的初始值。

底線 => static

全大寫 + "_" => final

UML中並沒有關於 final 的表示方法,你可以依照 java 的命名慣例來判斷是否要加上 final 的宣告。

字母全大寫,字和字之間用 "_" 連接。

想表達特別的屬性 << Stereotypes >>

<< primary key >> -customerID : String

方法區隔

< 存取範圍 > < 方法名稱 > ( [ < 參數 > ] ) : < 回傳型態 >

存取範圍

同屬性存取範圍

方法名稱

同屬性名稱

參數

可選擇性地宣告,是一個使用逗號分隔的清單,使用下列的語法來宣告方法的參數 :

[ 種類 ] < 參數名稱 > : < 參數型態 >

種類 : 可選擇的宣告,在 java 實作上通常會省略,但如果特別加上 in 的宣告,則要宣告為 final 。

參數名稱 : 同屬性名稱

參數型態 : 同屬性型態

回傳型態

同屬性型態

有加上底線,但方法名稱同類別名稱 => 建構式

斜體字 => abstract

關係

外部連結

物件之間的基本關係。

泛化 (繼承 extends)

空心三角形 + 實線

Generalization

繼承的反方向,指父類別 具有 子類別 的共有功能。

子類別可視為父類別的特例,並可以增加新功能。

實現 (實作 implements)

空心三角形 + 虛線

指一個class 實現 interface 的功能。

依賴

燕尾箭頭 + 虛線

簡單理解為 A 使用了 B " ... uses a ..."

被依賴的物件只是被當作工具使用,並不持有對它的參照。

而這種使用關係是非常弱的,其具有偶然性、臨時性,但是B的變化會影響到A。

在程式碼方面,B會作為參數 放在 A 的某個 method。

關聯 (結合)

燕尾箭頭 + 實線

Association

在語意上指兩個 class、class & port 之間有一種強依賴關係。 "... has a ..."

關聯關係是指一個 class 之類知道另外一個類別的屬性、方法。 通常含有「知道」、「了解」的含意。

在程式碼層面,被關聯類別 以類別屬性的形式 出現在關聯類別中,也可能是關聯類別參照了一個 類別型為 被關聯類別 的全域變數。

範例: 上方 : 結合數量、結合關係 下方 : 結合角色

       1        own       1
ClassA  --------------------> ClassB
       GUI      Mathematical

數量: 同屬性數量

Java 在結合數量上的實作,可以使用下列幾種方法 : 0個 代表可以為 null 確定的數量可以使用陣列 or Collection 不確定的數量可以使用 Collection

<< local >>

public class ClassA {
       public void methodA() {
              ClassB b = new ClassB(); 
       }
}

生命週期只在區塊哩,彼此之間沒有直接關係。

<< parameter >>

public class ClassA {
       public void methodA(ClassB b) {
              ...
       }
}

透過參數來取得 ClassB,建立物件的責任在於呼叫 method 的類別。 這種情況有另外一種表示方式 將關聯的實線改成虛線,這樣就不用標記 << parameter >> 了。

<< create >>

public class ClassA {
       public ClassB getClassB() {
              return new ClassB(); 
       }
}

由 ClassA 來負責建立 ClassB,這種方法稱為 << Factory method >> 這是一種常見的 設計模式(Design Pattern)

<< delegate >>

public class ClassA {
       private ClassB b;
       public void methodA() {
              q.methodA();
       }
}

Delegate 是代理的意思,ClassA 扮演代理者,由ClassA 負責將方法的呼叫,轉為 ClassB 的method 呼叫。

聚合

空心菱形 + 實線

Aggregate

聚合 是表示 整體 與 部分 的特殊關聯關係。 是「弱」的包含(... own a ...) 成分類別不依靠聚合類別也可以單獨存在,聚合和成分各自具有生命週期。 部分 可以屬於多個整體物件,也可以為多個整體物件共用(sharable)。

EX:池塘&鴨子

聚合在 java 實作時,跟結合差不多,但要注意 "被擁有者" 一定會被建立

組成(組合)

實心菱形 + 實線

Composition 組成 是「強」的 整體與部分 的包含關係(... is a part of ...) 成分類別必須依靠合成類別而存在 整體和部分是不可分的,整體 的生命週期 就等同於 部分 的生命週期。

EX:汽車&化油器

是一種特殊情況的聚合關係,它跟聚合的差別在於方向的角度。 你可以 "把聚合視為 單向、把組合視為 雙向" 的結合關係。

因為組合的特性,另外有兩個狀況要注意

一個成員物件不能同時被兩個擁有者擁有

擁有者要負責成員的生命週期

在 java 技術中,物件的解構 deconstruct 是透過 GC Garbage collection 來完成。 但在一些特殊情況下,你可能需要覆寫 Object 類別中的 finalize 方法。

巢狀類別 Nested class

巢狀類別中有一個比較特別的情形是 匿名類別 Anonymous class,UML 並沒有特別制定的表示方法。

結合類別 - 表示集合容器型態

在討論聚合時使用的範例圖型,它所顯示的資訊還不夠詳細。

如果想要在圖型中顯示容器的種類,可以在兩個物件關聯的實線上,接出一條虛線,放容器的型態 (可參考詳細資料)

限定結合

最常見的情況是在使用 Map 的時候。

類別層級的關係

概括

空心箭頭 + 實線

實現

空心箭頭 + 虛線

一般關係

依賴

多重

Last updated