UML 文章前導
在本文中,我們將深入介紹 UML(Unified Modeling Language
)的各個方面,為您提供全面的了解和實用的知識。 從 UML 的基礎概念開始,我們將逐一探討使用案例圖、類別圖、序列圖、協作圖、狀況轉換圖、元件圖、部署圖等主題。 透過簡單的範例程式和圖示,我們將以清晰易懂的方式解釋UML 的關鍵概念,並深入研究UML 類別之間的各種關係,如類的可見性、Association
(Field 關係)、Dependency
(返回 、呼叫、創建)、泛化(Generalization
)、實現(Realization
)和聚集(Aggregation
)等。
最後,我們還將涉及一些其他延伸概念,例如類別的多重性(Multiplicity
),以幫助您更全面地理解和應用 UML
無論您是初學者還是有一定經驗的軟體開發人員,本文都將為您提供有價值的信息,使您能夠更好地理解和運用 UML,從而提高軟體設計的品質和效率
UML 分類簡介
UML (Unified Modeling Language
) 是一種定義良好、不分語言、功能強大的 視覺化建模語言,其目標是為開發團隊提供標準通用的物件導向設計通用語
而 UML 並不只有一種圖示,我們可以 依照不同角色、狀況選用不同圖示(框圖) ,主要 UML 分類包含如下
UML 分類 | 說明 |
---|---|
用例圖(Use Case Diagram ) | 從 使用者角度 描述系統功能 |
類別圖(Class Diagram ) | 描述物件模型中,類與類之間的關係 |
序列圖(Sequence Diagram )、協作圖(Cooperation Diagram ) | 描述物件之間的 互動關係,並強調 時間順序 |
狀態轉換圖(State Transition Diagram ) | 描述一個物件在某些條件下的狀態切換 |
組件圖(Component Diagram ) | 以較上層的角度描述軟體元件之間的關係,也可以描述軟體程式的 結構圖 |
佈署圖(Deployment Diagram ) | 描述軟體 與硬體的物理結構 |
用例圖 Use Case Diagram
● 用例圖(Use Case Diagram
)包含以下內容用例圖包含以下內容
內容 | 說明 | 補充 |
---|---|---|
角色 | 角色乃是 系統邊界,就是使用系統的使用者 | 用 人形符號 表示 |
用例 | 角色使用系統的某個功能 | 用 橢圓符號 標示 |
● 角色使用功能時(用例),或是功能呼叫另一個功能時,使用 實線的箭頭符號表示
- 在軟體分析功能(用例)的細節、處理流程,每個用例可以用 例檔 來描述,主要可以分為以下幾種:
- 前置條件
- 主流事件
- 其他事件流:以當前分析的角度來看,除了主流程的都是其他事件流
- 後置條件(不一定會有)
類別圖 Class Diagram
● 類別圖(Class Diagram
)是我們最常見的圖,它代表類與類之間的 靜態結構;它的內容如下● 角色使用功能時(用例),或是功能呼叫令一個功能時,使用 實線的箭頭符號表示
內容 | 說明 | 補充 |
---|---|---|
類別 | 類別圖的主要元素 | 使用矩形表示,如果是抽象類則使用 斜體字 表示(抽象方法也一樣) |
類之間的關係 | 類的關係有很多種(下面說明) | 依照不同關係使用不同的線條 |
序列圖、協作圖
- 「序列圖」描述了一次會描述出「兩個維度」重點
- 水平維度: 表示物件之間的呼叫過程(發送訊息的過程)
- 垂直維度: 表示呼叫方法的順序
● 「協作圖」重點在描述 角色之間的互動
序列圖 vs. 協作圖
序列圖展示了物件與角色之間的是透過時間推移進行互動,而協作圖則不能參照時間
狀態轉換圖
● 有時候物件會因為某行行為切換自身的狀態,而如果那 狀態切換較為複雜,就可以使用狀態圖描述;而該圖的內容如下
重點是什麼「行為」,導致「狀態的改變」
內容 | 代表圖示 |
---|---|
初始點 | 用實心圓表示 |
狀態轉換 | 用箭頭表示 |
狀態 | 用元腳矩形表示 |
中止點 | 用內部包含實心圓的圓表示 |
組件圖
● 組件圖,主要是顯示 軟體系統中元件(或是子系統)之間的關係(用較高層級的角度分析軟體),常用在顯示與其他第三方元件(SDK, Library)的關係
佈署圖
● 佈署圖表示的是,軟體系統如何佈署到硬體環境中,能夠展示 軟體系統中的元件在硬體環境中的物理布局,如下圖
內容 | 代表圖示 |
---|---|
節點 | 三維立方體 |
UML 類別之間的關係
這個符號可以用在 Class
、Method
、Field
,它可以描述用來描述該類 (模型),可以描述對象目標的透明度 (使用類的 Scope、Visibility)
類關係 | 概述 |
---|---|
關聯 | 兩個類之間存在一定的關係 |
依賴 | 為某類提供服務 |
聚集 | 相當於組合 |
泛化 | 繼承 |
實做 | 實做界面 |
類別:可見性的代表符號
● 這個符號可以用在 Class
、Method
、Field
,它可以描述用來描述該類 (模型),可以描述對象目標的透明度 (使用類的 Scope、Visibility)
權限 | 符號 |
---|---|
public | + |
protected | # |
private | - |
package | ~ |
// 符號範例
class StudentInfo {
public String name;
protected String nickName;
private int age;
int number;
}
類別 Association Field 關係
● Association
聯合 (單、雙向):就像 Class 中的 member(也就是 Field
);關聯更多時候是指「參照語意」
A. 雙向 Association
public class Teacher {
private Student student = new Student();
}
public class Student {
private Teacher teacher = new Teacher();
}
B. 單向 Association
:有方向性
private class Info { }
public class Teacher {
private Info info = new Info();
}
public class Student {
private Teacher teacher = new Teacher();
}
C. 自身 Association
:無箭頭
public class Student {
private Student next = new Student();
}
D. 多維關聯 Association
:無箭頭
private class Info {
private Teacher t = new Teacher();
private Student s = new Student();
}
public class Teacher {
private Info info = new Info();
private Student s = new Student();
}
public class Student {
private Info info = new Info();
private Teacher t = new Teacher();
}
類別 Dependency 返回、呼叫、創建
● Dependency
依賴 (使用關係):依賴關係有兩個大方向(它很容易跟關聯搞混,簡單記的話,只要記住關聯是 Class 內的 Field,其餘都是依賴)
Dependency
的含義,在類別設計中使用「依賴」更有程式語法中的「參照類型」之意(Reference)
A. 實體化某個類型(返回某個類型)
public class Engine { }
public class Car {
// Car 依賴 Engine(創建)
public Engine getEngine() {
return Engine();
}
}
B. 返回類型 & 呼叫某個類型的方法
public class Engine {
public int getPower() {
return 300; // 返回 int 類型
}
}
public class Car {
// Car 依賴 Engine(使用)
public String getEngineInfo(Engine e) {
return "Car power: " + e.getPower(); // 使用 Engine 類型
}
}
依賴者指向,依賴對象,使用虛線實體箭頭
泛化 Generalization
● 繼承類:使用帶實線的 空三角形箭頭 表示繼承
abstract class Engine {
protected abstract int calPower();
}
class SmallEngine extends Engine {
protected int calPower() {
return 10;
}
}
實現 Realization
● 實作介面:使用 線實體箭頭 代表實做
interface IBook {
void addBook(Book book);
Book getBook(int index);
}
class ImplBook implement IBook {
public void addBook(Book book) {
// TODO:
}
public Book getBook(int index) {
// TODO:
}
}
聚集 Aggregation
● Aggreation
聚合 (ByRef
、ByValue
):
A. ByRef
空菱形:稱為 聚合,用來表示 集體
& 個體
之間的關係;有「參照語意」之意… 類拆開後仍各有存在意義,類與類之間 有獨立的生命週期,但是又會互相制衡;
eg. 檯燈、燈泡
public class Student { }
public class MyClass {
private Student[] students = new Student()[];
}
B. ByValue
實菱形:又稱為 複合 (又稱為組合、強聚集),用來表示 個體
與部分部件的關係 (該部件不可輕易分離,關係較緊密);有「值語意」之意
類拆卸後其存在意義不大(以商業邏輯的角度去看)、有 生命週期的牽連(共存亡),概念範例如下…
- 電路板、電阻、電容
- 人類、心臟、頭、眼睛
public class Student {
private Heart heart;
private Head head;
private Eyes eyes;
}
何時該用
ByRef
或是ByValue
?這可以須根據 場景、語意、商業邏輯 的角度去分析
其他延伸概念 Other
類 - 多重性 Multiplicity
● 多重性 (Multiplicity
):
權限 | 符號 |
---|---|
0 | 0 個 |
1 | 1 個 |
* | 多個 |
0…* | 0 ~ 多個 |
1…* | 1 ~ 多個 |
A. 聚合的多重性表達:在 UML 中,聚合表示整體對象可以包含部分對象,但它們不是強耦合的。以下是在 Java 中使用聚合關係表示多重性的範例程式碼
import java.util.List;
class WholeObject {
// 其他成員
// 聚合關係
private List<PartObject> parts;
public List<PartObject> getParts() {
return parts;
}
public void setParts(List<PartObject> parts) {
this.parts = parts;
}
}
class PartObject {
// 其他成員
}
public class AggregationExample {
public static void main(String[] args) {
WholeObject whole = new WholeObject();
// 創建部分對象
PartObject part1 = new PartObject();
PartObject part2 = new PartObject();
// 設定聚合關係
whole.setParts(List.of(part1, part2));
// 其他操作...
}
}
B. 鏈結關係:在 UML 中,鏈結關係表示類別之間的鏈接(可以是連接其他類、或是連接自身)。以下是在 Java 中使用鏈結關係表示多重性的範例程式碼
class Information {
private Information privateInformation;
}
更多的物件導向設計
物件導向的設計基礎如下,如果是初學者或是不熟悉的各位,建議可以從這些基礎開始認識,打好基底才能走個更穩(在學習的時候也需要不斷回頭看)!
創建模式 Creation Patterns
● 創建模式 PK
● 創建模式 - Creation Patterns
:
創建模式用於「物件的創建」,它關注於如何更靈活、更有效地創建物件。這些模式可以隱藏創建物件的細節,並提供創建物件的機制,例如單例模式、工廠模式… 等等,詳細解說請點擊以下連結
● Singleton 單例模式 | 解說實現 | Android Framework Context Service
● Abstract Factory 設計模式 | 實現解說 | Android MediaPlayer
● Factory 工廠方法模式 | 解說實現 | Java 集合設計
● Builder 建構者模式 | 實現與解說 | Android Framwrok Dialog 視窗
● Clone 原型模式 | 解說實現 | Android Framework Intent
行為模式 Behavioral Patterns
● 行為模式 PK
● 行為模式 - Behavioral Patterns
:
行為模式關注物件之間的「通信」和「職責分配」。它們描述了一系列物件如何協作,以完成特定任務。這些模式專注於改進物件之間的通信,從而提高系統的靈活性。例如,策略模式、觀察者模式… 等等,詳細解說請點擊以下連結
● Stragety 策略模式 | 解說實現 | Android Framework 動畫
● Interpreter 解譯器模式 | 解說實現 | Android Framework PackageManagerService
● Chain 責任鏈模式 | 解說實現 | Android Framework View 事件傳遞
● Specification 規格模式 | 解說實現 | Query 語句實做
● Command 命令、Servant 雇工模式 | 實現與解說 | 物件導向設計
● Memo 備忘錄模式 | 實現與解說 | Android Framwrok Activity 保存
● Visitor 設計模式 | 實現與解說 | 物件導向設計
● Template 設計模式 | 實現與解說 | 物件導向設計
● Mediator 模式設計 | 實現與解說 | 物件導向設計
● Composite 組合模式 | 實現與解說 | 物件導向設計
● Observer 觀察者模式 | JDK Observer | Android Framework Listview
結構模式 Structural Patterns
● 結構模式 PK
● 結構模式 - Structural Patterns
:
結構模式專注於「物件之間的組成」,以形成更大的結構。這些模式可以幫助你確保當系統進行擴展或修改時,不會破壞其整體結構。例如,外觀模式、代理模式… 等等,詳細解說請點擊以下連結
● Decorate 裝飾模式 | 解說實現 | 物件導向設計
● Iterator 迭代設計 | 解說實現 | 物件導向設計
感謝大師賜教
以下有些錯別字給大師優化
其目標是為開發團隊題標準通用的物件導向設計通用語 => 其目標是為開發團隊『提供』標準通用的物件導向設計通用語
呼叫令一個功能時 => 呼叫『另』一個功能時
為度 => 『維』度
它很容易跟關聯稿混 => 它很容易跟關聯『搞』混
感謝大大 XD