UML(統一建模語言)對現代軟體開發者而言早已不是陌生概念。隨著物件導向開發成為主流,UML 更成為溝通設計藍圖的通用語言。本文探討 UML 有兩大動機:首先,UML 專為物件導向軟體開發而設計,而 C++ 正是典型的物件導向語言;其次,設計模式的表達高度依賴 UML 類別圖與序列圖,不懂 UML 便無法深入理解經典設計模式。
UML 全稱 Unified Modeling Language,1997 年經 OMG 標準化。其目的在於對軟體密集型系統進行可視化、詳述、構造與文檔化。UML 由多種視圖組成,對開發者最關鍵的莫過於:
注意:View(視圖)是抽象的角度,Diagram(圖表)是具體的繪製產出,兩者不可混淆。
類別圖以矩形框表示類別,線條與符號描述關係。以下逐一解析核心關係:

空心三角箭頭指向父類別,表示 Generalization(泛化),對應 C++ 的 public 繼承:
class Base { ... };
class A : public Base { ... };
class B : public Base { ... };
class C : public Base { ... };

類別框可分三層:名稱、屬性、操作。UML 不強制繪製所有細節,以「夠用、清晰」為原則,避免過度設計。

空心菱形指向整體類別。表示 B 擁有 A,但 A 的生命週期不受 B 控制:
class A { ... };
class B { A* theA; ... };

實心菱形表示組合。A 的生命週期完全由 B 掌控,隨 B 誕生而生、隨 B 消亡而亡:
class A { ... };
class B { A theA; ... };

虛線箭頭表示 B 依賴 A。若 A 變更,B 可能受影響。典型場景為函數參數、區域變數或靜態方法呼叫:
class A { ... };
class B { void fun(A param); ... };
傳統流程圖難以描述物件間的消息傳遞,序列圖應運而生。以偽碼為例:
class Circle {
void fillColor() { ... }
void draw() { fillColor(); }
};
class Window {
Circle _circle;
void drawCircle() { _circle.draw(); }
};
Window wnd;
wnd.drawCircle();

圖中要素解讀:
wnd、_circle)draw() 呼叫 fillColor())UML 遠不止類別圖與序列圖,還包含用例圖、狀態圖、活動圖、部署圖等。但對 C++ 開發者而言,掌握這兩張「核心圖」已足以應對 80% 的設計溝通場景。下一篇將引入設計模式,屆時你將親身體會 UML 以圖說架構的優雅威力。