# 類別圖

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

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

## 類別名稱區隔

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

類別 直接呈現

抽象類別 右下角 {abstract}

介面 上方 << interface >>

&#x20;**&#x20;*****UML制定了許多 Stereotypes "<< >>"，EX: << interface >>*****&#x20;**&#x20;

## 屬性區隔

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

### 可見性、存取範圍

```
+    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)

&#x20;**&#x20;*****空心三角形 + 實線*****&#x20;**&#x20;

Generalization

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

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

#### 實現 (實作 implements)

&#x20;**&#x20;*****空心三角形 + 虛線*****&#x20;**&#x20;

指一個class 實現 interface 的功能。

#### 依賴

&#x20;**&#x20;*****燕尾箭頭 + 虛線*****&#x20;**&#x20;

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

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

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

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

#### 關聯 (結合)

&#x20;**&#x20;*****燕尾箭頭 + 實線*****&#x20;**&#x20;

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 呼叫。

#### 聚合

&#x20;**&#x20;*****空心菱形 + 實線*****&#x20;**&#x20;

Aggregate

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

EX:池塘&鴨子

&#x20;**&#x20;*****聚合在 java 實作時，跟結合差不多，但要注意 "被擁有者" 一定會被建立*****&#x20;**&#x20;

#### 組成(組合)

&#x20;**&#x20;*****實心菱形 + 實線*****&#x20;**&#x20;

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

EX:汽車&化油器

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

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

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

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

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

#### 巢狀類別 Nested class

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

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

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

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

#### 限定結合

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

## 類別層級的關係

### 概括

&#x20;**&#x20;*****空心箭頭 + 實線*****&#x20;**&#x20;

### 實現

&#x20;**&#x20;*****空心箭頭 + 虛線*****&#x20;**&#x20;

## 一般關係

### 依賴

### 多重
