[注] 本文不是包圖的基礎教程, 只是包圖的圖形總結.
學習UML圖形
推薦閱讀<UML參考手冊>第2版. http://www.umlchina.com/
推薦微軟的開發軟件設計模型 http://msdn.microsoft.com/zh-cn/library/dd409436.aspx
包圖主要用來表現包和它所包含元素的組織, 包圖最常用的用途是用來組織用例圖和類圖, 盡管它不局限於這些UML元素.
〇 概述

包圖可使用的工具集(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成員
二 UML通用元素
參見UML參考手冊中的特性描述部分, 如一些注釋元素, 不單只能畫到用例圖中, 而是通用的可以畫到任何UML圖形上的.
如圖邊界右上角的注釋元素

三 包圖總結
本節中出現的建議可應用到任何一種UML圖的包應用上, 並非只是包圖上.
1. 包的命名要簡單, 具有描述性
例如Shipping, Customer, Enrollment和Manage, 這樣包包含了些什么就非常的清楚了.
2. 應用包是為了簡化圖
通常在一個圖變得笨重, 單一頁中打印不下的時候引入包. 換句話說, 遵循通用指南一一把大的圖重新組織為較小的圖, 你需要對模型使用分而治之的方法.
3. 包應該連貫
你插入包中的任何東西都應該有意義, 都需要考慮包中的其余內容. 為了確定一個包是否連貫, 一個好的經驗法則是你是否能夠用一個短的, 描述性的名稱為包命名.
如果你做不到這一點, 你或許就已經把幾個不相關的事務放到包中了.
4. 在包上用版型注明架構層
我們通常會把設計組織到架構層次中, 例如user interface, business/domain, persistence/data和infrastructure/system.
5. 避免包間的循環依賴
包A依賴於包B, 包B依賴於包C, 而包C依賴於包A, 這就形成了循環: A-B-C-A, Knoernschild (2002)建議盡量避免出現這種情況.
因為包之間彼此緊密耦合, 將來的維護和改進將變得困難. 循環依賴是一個很好的信號, 意味着你需要重構一個或多個的包, 把導致循環依賴的因素從包中除掉.
6. 包依賴應該反映內部關系
當一個包依賴於另一個時, 這意味着兩個包的內容間存在着一個或多個的關系. 例如: 如果是一個用例包圖, 那么就有可能兩個用例之間存在includes, extends, 或繼承關系, 而兩個用例分別處於不同的包中.
總結來自 http://developer.51cto.com/art/201007/209059.htm
相關鏈接:
UML 結構圖之用例圖 總結 http://www.cnblogs.com/snowyying/p/UML_UseCase.html
