[注] 本文不是類圖的基礎教程, 只是類圖的圖形總結.
學習UML圖形
推薦閱讀<UML參考手冊>第2版. http://www.umlchina.com/
推薦微軟的開發軟件設計模型 http://msdn.microsoft.com/zh-cn/library/dd409436.aspx
類圖展示了面向對象系統的構造模塊。描繪模型(或部分模型)的靜態視圖,顯示它包含的屬性和行為,而不是詳細描述操作的功能或完善方法。
類圖最常用來表達多個類和接口之間的關系。
〇 概述

可使用的工具集(EA工具箱)有:

一 類圖元素
1. 包

Package, 圖形表示為一個文件夾, 包的版型(StereoType)有:
1) 普通包, 表示為一個文件夾, 如圖Package1和Package4
2) 其它包, 表示為一個文件夾+書名號包含的具體版型或特殊符號, 如圖Package2和Package3
2. 類

Class, 圖形表示為一個實心矩形或圓形(橢圓)[+一系列附加符號], 類的版型(StereoType)有:
1) 普通類, 表示為一個實心矩形, 如圖Class1
2) 邊界類, 表示為一個實心圓形+實豎線, 如圖Class2
3) 實體類, 表示為一個實心圓形+實橫線, 如圖Class3
4) 控制類, 表示為一個實心圓形+在圓周上的箭頭, 如圖Class4
5) 其它類, 表示為一個實心矩形或圓形(橢圓)+書名號包含的具體版型或特殊符號, 如圖Class 5, 6, 7 ...
[注1] 類圖標變化最大, 版型最多, 必須根據所屬的視圖或圖形進行識別, 如Class2在包圖和類圖中稱為邊界類, 在活動圖中同樣的圖標應稱為邊界對象.
[注2] 類圖標的矩形表示和Artifact相似, 都是實心矩形, 區別方法是Artifact圖標會含有Icon, 而類圖標一般幾何元素拼湊.
[注3] 類圖標的橢圓表示和用例相似, 都是實心橢圓, 但用例不會出現在類圖上, 類也不應該出現在用例圖上, 因此不會沖突.
[注4] 包圖上的類一般引用類圖, 類圖內部的畫法, 參見類圖部分. (下同)
3. 接口

Interface, 圖形表示為一個實心矩形+書名號包含的interface字樣, 接口沒有版型(StereoType).
接口是特殊的類, 因此圖標和類相同, 書名號包含的interface是其區別與類的唯一方式.

注意: 接口如果沒有明確的詳細操作,也可以畫成一個圓環。當畫成圓環的時候,到這個環形標柱的實現連接沒有目標箭頭。
4. 數據類型

DataType, 圖形表示為一個實心矩形+書名號包含的datatype(或其它)字樣, 數據類型的版型(StereoType)有:
1) 數據類型, 表示為一個實心矩形+書名號包含的interface字樣, 如圖DataType1
2) 基本類型, 表示為一個實心矩形+書名號包含的interface字樣, 如圖PrimitiveType1
3) 枚舉類型, 表示為一個實心矩形+書名號包含的interface字樣, 如圖Enumeration1
4) 表格類型, 表示為一個實心矩形+書名號包含的interface字樣, 如圖Table1
5) 信號類型, 表示為一個實心矩形+書名號包含的interface字樣, 如圖Signal1
6) 其它類型, 表示為一個實心矩形+書名號包含的其它字樣, 如圖DataType 2, 3, 4 ...

[注4] 數據類型用來描述形如枚舉, 結構, 表格等特殊的數據類型或類, 同樣的, 使用不同的版型是為了定義更准確.
5. 關系
5.1 包與包之間的關系

1) 合並 merge, 表示為一條虛線+單向空心箭頭+書名號包含的merge字樣, 箭頭指向被合並的包, 如圖Controller合並GenApply
包合並定義了一個包的內容是如何被另一個包擴展的關系(包合並定義了源包元素與目標包同名元素之間的泛化關系).
2) 導入(引入) import/access, 表示為一條虛線+單向空心箭頭+書名號包含的import/access字樣, 箭頭指向被合並的包, 如圖Controller導入Interger
包導入是一種允許采用非限定性名稱訪問來自於另一個命名空間中的元素的關系.
3) 嵌套 nesting, 表示為一條實線+帶十字線的實心圓, 圓遠離被合並的包, 如圖Controller嵌套ConnSeq(即ConnSeq被嵌套)
源包和目標包間的嵌套連接符說明目標包完全包含源包.
5.2 類與類(接口/數據類型)之間的關系

本圖中使用的例子來自 http://blog.csdn.net/tianhai110/article/details/6339565
1) 實現 realization, 表示為一條虛線+單向空心箭頭, 箭頭指向被實現的接口
2) 泛化 generalization, 表示為一條實線+單向空心箭頭, 箭頭指向被泛化的基(父)類
3) 依賴 dependency, 表示為一條虛線[+單向或雙向開口箭頭], 單向箭頭表示單向依賴
4) ① 關聯 association, 表示為一條實線[+單向或雙向開口箭頭], 單向箭頭表示單向關聯
4) ② 聚合 aggregation , 表示為一條實線[+單向空心菱形], 空心菱形箭頭指向目標類或父類
4) ③ 組合 composition, 表示為一條實線[+單向實心菱形], 實心菱形箭頭指向目標類或父類
[注5] 應避免雙向依賴.
[注6] 幾種關系所表現出的強弱程度從弱到強依次是: 依賴 < 關聯 < 聚合 < 組合 ( 即耦合度: 組合 > 聚合 > 關聯 > 依賴 ).
6. 可見性

6.1 包的可見性
Package Visibility, 使用版型(StereoType)表示, <<import>>表示public, <<access>>表示private
[注] import VS access:
Ordering在import導入Products和Pricing后可直接使用Products和Pricing包內的元素;
Ordering在access導入Storage后仍可直接使用Storage包內的元素;
而當Ordering被其它包引用時, 其它包只能直接使用Products和Pricing包內的元素, 不能直接使用Storage包內的元素; 但仍可采用Storage::Goods這樣的限定性名訪問Storage包中的元素.
6.2 類(接口/數據類型)的可見性
Class Visibility, 使用 +/-/#/~ 符號表示
1) 公共 public, 用 + 號表示, 如圖Storage包內Goods類的GetCount成員
2) 私有 private, 用 - 號表示, 如圖Storage包內Goods類的Count屬性
3) 保護 protected, 用 # 號表示, 如圖Storage包內Goods類的SetCount成員
4) 包 package, 用 ~ 號表示, 代表包內可見, 如圖Storage包內Goods類的Test成員
二 類圖關系
1. 實現 realization
是源對象執行或實現目標,實現被用來表達模型的可跟蹤性和完整性-業務模型或需求被一個或多個用例實現,用例則被類實現,類被組件實現,等等。這種實現貫穿於系統設計的映射需求和類等,直至抽象建模水平級。從而確保整個系統的一張宏圖,它也反映系統的所有微小組成,以及約束和定義它的細節。實現關系用帶虛線的實箭頭表示。

2. 泛化 generalization
泛化被用來說明繼承關系。連接從特定類元到一般類元。泛化的含義是源類繼承了目標類的特性。
下圖的圖顯示了一個父類泛化一個子類, 類“Circle”的一個實例將會有屬性 “ x_position”,“ y_position” , “radius” 和 方法 “display()”。
注意:類 "Shape" 是抽象的,類名顯示為斜體。

3. 依賴 dependency
依賴被用來描述模型元素間廣泛的依賴關系。
通常在設計過程早期顯示兩個元素之間存在某種關系,因為是初期而不能確定具體是什么關系,在設計過程末期,該繼承關系會被歸入已有構造型 (構造型 可以是實例化 «instantiate»,跟蹤 «trace»,導入 «import», 和其它的關系),或被替換成一個更明確類型的連接符。
3.1 跟蹤 trace
跟蹤關系是一種特殊化的依賴關系。連接模型元素或跨模型但是具有相同概念的模型元素集。
跟蹤被經常用來追蹤需求和模型的變化。由於變化是雙向的,這種依賴關系的順序通常被忽略。
這種關系的屬性可以被指定為單向映射,但跟蹤是雙向的,非正式的和很少可計算的。
4. 關聯 association
4.1 關聯 Association
關聯描述了系統中對象或實例之間的離散連接.
關聯表明兩個模型元素之間有關系,通常用在一個類中被實現為一個實例變量。
連接符可以包含兩端的命名的角色,基數性,方向和約束。
關聯是元素之間普通的關系。如果多於兩個元素,也可以使用菱形的關聯關系。
當從類圖生成代碼時,關聯末端的對象將變成目標類中實例變量。見下圖示例 "playsFor" 將變成"Player"類中的實例變量。

4.2 聚合 Aggregations 與 組合 Aggregations
聚合表示部分與整體關系的關聯.
組合表示更強形式的關聯, 整體有管理部分的完整職責, 比如為它們分配和釋放空間.

三 靜態視圖
1. 概述
1) 靜態視圖是UML的基礎. 模型中的元素是應用中有意義的概念, 包括真實世界的概念, 抽象的概念, 實現方面的概念...系統中各種概念.
2) 靜態視圖捕捉對象的結構. 面向對象的系統把數據結構和行為特征統一到一個對象結構中. 靜態視圖包括所有傳統數據結構的內容, 同時也包括了數據相關操作的構成.
3) 靜態視圖將行為的聲明, 比如操作, 描述成離散的模型元素, 但是不包括它們動態行為的細節. 靜態視圖將這些聲明作為可命名實體對待, 這些實體的動態行為在其他視圖中描述. 動態視圖要求靜態視圖描述動態交互的事物 -- 如果希望說清楚交互是怎樣進行的, 就必須先說清楚是什么在交互. 靜態視圖是建立其他視圖的基礎.
4) 靜態視圖中關鍵元素是類元及它們之間的關系. 類元是描述事物的建模元素. 類元有若干種, 包括類, 接口和數據類型. 行為實體, 比如用例和信號, 同樣被具體化為類元. 例如組件, 協作和節點這樣的類元能夠體現實現方面的意圖.
5) 為了利於理解和模型的可重用性, 大的模型必須由較小的單元組成. 包是擁有和管理模型內容的一般目的組織單元. 每個元素都被包所擁有. 模型是一個包的集合, 這些包描述了系統的完整視圖, 並且能夠或多或少地被獨立使用. 模型則指定一個直接包含所有包的根包.
2. 類元
1) 類
2) 接口
3) 數據類型
4) 含義分層
