注:本文為IBM Developer網(wǎng)站UML2.X系列教程的學(xué)習(xí)筆記,原文參見:http://www.ibm.com/developerworks/cn/rational/r-uml/
一、UML中基本的圖范疇:
在 UML 2 中有二種基本的圖范疇:結(jié)構(gòu)圖和行為圖。每個(gè) UML 圖都屬于這二個(gè)圖范疇。結(jié)構(gòu)圖的目的是顯示建模系統(tǒng)的靜態(tài)結(jié)構(gòu)。它們包括類,組件和(或)對(duì)象圖。另一方面,行為圖顯示系統(tǒng)中的對(duì)象的動(dòng)態(tài)行為,包括如對(duì)象的方法,協(xié)作和活動(dòng)之類的內(nèi)容。行為圖的實(shí)例是活動(dòng)圖,用例圖和序列圖。
二、UML中的類圖:
1.類圖的表示:
類的 UML 表示是一個(gè)長方形,垂直地分為三個(gè)區(qū),如圖 1 所示。頂部區(qū)域顯示類的名字。中間的區(qū)域列出類的屬性。底部的區(qū)域列出類的操作。在一個(gè)類圖上畫一個(gè)類元素時(shí),你必須要有頂端的區(qū)域,下面的二個(gè)區(qū)域是可選擇的(當(dāng)圖描述僅僅用于顯示分類器間關(guān)系的高層細(xì)節(jié)時(shí),下面的兩個(gè)區(qū)域是不必要的)。

描述:
頂部區(qū)域顯示類的名字。中間的區(qū)域列出類的屬性。底部的區(qū)域列出類的操作。當(dāng)在一個(gè)類圖上畫一個(gè)類元素時(shí),你必須要有頂端的區(qū)域,下面的二個(gè)區(qū)域是可選擇的(當(dāng)圖描述僅僅用于顯示分類器間關(guān)系的高層細(xì)節(jié)時(shí),下面的兩個(gè)區(qū)域是不必要的)。
·類名:如果是抽象類,則采用斜體
·類屬性列表:name : attribute type 如 flightNumber : Integer,這是最常見的表達(dá)形式
name : attribute type = default value 如 balance : Dollars = 0,這是帶有默認(rèn)值的表達(dá)形式
·類方法列表:name(parameter list) : type of value returned
在業(yè)務(wù)類圖中,屬性類型通常與單位相符,這對(duì)于圖的可能讀者是有意義的(例如,分鐘,美元,等等)。然而,用于生成代碼的類圖,要求類的屬性類型必須限制在由程序語言提供的類型之中,或包含于在系統(tǒng)中實(shí)現(xiàn)的、模型的類型之中。
2.繼承的表示:
為了在一個(gè)類圖上建模繼承,從子類(要繼承行為的類)拉出一條閉合的,單鍵頭(或三角形)的實(shí)線指向超類。

類名BankAccount和withdrawal操作使用斜體。這表示,BankAccount 類是一個(gè)抽象類,而withdrawal方法是抽象的操作。換句話說,BankAccount 類使用withdrawal規(guī)定抽象操作,并且CheckingAccount 和 SavingsAccount 兩個(gè)子類都分別地執(zhí)行它們各自版本的操作。
3.接口的表示:
一個(gè)類和一個(gè)接口不同:一個(gè)類可以有它形態(tài)的真實(shí)實(shí)例,然而一個(gè)接口必須至少有一個(gè)類來實(shí)現(xiàn)它。在 UML 2 中,一個(gè)接口被認(rèn)為是類建模元素的特殊化。因此,接口就象類那樣繪制,但是長方形的頂部區(qū)域也有文本“interface”。

注意:繼承用帶箭頭或三角形的實(shí)線表示,實(shí)現(xiàn)用帶箭頭或三角形的虛線表示
4.可見性的表示:
在面向?qū)ο蟮脑O(shè)計(jì)中,存在屬性及操作可見性的記號(hào)。UML 識(shí)別四種類型的可見性:public,protected,private及package。
UML 規(guī)范并不要求屬性及操作可見性必須顯示在類圖上,但是它要求為每個(gè)屬性及操作定義可見性。為了在類圖上顯示可見性,放置可見性標(biāo)志于屬性或操作的名字之前。雖然 UML 指定四種可見性類型,但是實(shí)際的編程語言可能增加額外的可見性,或不支持 UML 定義的可見性。表4顯示了 UML 支持的可見性類型的不同標(biāo)志。
UML 支持的可見性類型的標(biāo)志
標(biāo)志 |
可見性類型 |
+ | Public |
# | proteted |
- | private |
~ | package |

5.關(guān)聯(lián)的表示:
·雙向(標(biāo)準(zhǔn))的關(guān)聯(lián)
關(guān)聯(lián)是兩個(gè)類間的聯(lián)接。關(guān)聯(lián)總是被假定是雙向的;這意味著,兩個(gè)類彼此知道它們間的聯(lián)系,除非你限定一些其它類型的關(guān)聯(lián)。

一個(gè)雙向關(guān)聯(lián)用兩個(gè)類間的實(shí)線表示。在線的任一端,你放置一個(gè)角色名和多重值。圖 6 顯示Flight與一個(gè)特定的Plane相關(guān)聯(lián),而且Flight類知道這個(gè)關(guān)聯(lián)。因?yàn)榻巧訮lane類表示,所以Plane承擔(dān)關(guān)聯(lián)中的“assignedPlane”角色。緊接于Plane類后面的多重值描述0...1表示,當(dāng)一個(gè)Flight實(shí)體存在時(shí),可以有一個(gè)或沒有Plane與之關(guān)聯(lián)(也就是,Plane可能還沒有被分配)。圖 6 也顯示Plane知道它與Flight類的關(guān)聯(lián)。在這個(gè)關(guān)聯(lián)中,F(xiàn)light承擔(dān)“assignedFlights”角色;圖 6 的圖告訴我們,Plane實(shí)體可以不與flight關(guān)聯(lián)(例如,它是一架全新的飛機(jī))或與沒有上限的flight(例如,一架已經(jīng)服役5年的飛機(jī))關(guān)聯(lián)。
注意:關(guān)聯(lián)的一方關(guān)聯(lián)對(duì)象位于直線的上端,關(guān)聯(lián)數(shù)目位于同側(cè)的直線下端,另一方則相反
多重值和它們的表示
可能的多重值描述 |
|
表示 | 含義 |
---|---|
0..1 | 0個(gè)或1個(gè) |
1 | 只能1個(gè) |
0..* | 0個(gè)或多個(gè) |
* | 0個(gè)或多個(gè) |
1..* | 1個(gè)或多個(gè) |
3 | 只能3個(gè) |
0..5 | 0到5個(gè) |
5..15 | 5到15個(gè) |
·單向關(guān)聯(lián)
在一個(gè)單向關(guān)聯(lián)中,兩個(gè)類是相關(guān)的,但是只有一個(gè)類知道這種聯(lián)系的存在。

一個(gè)單向的關(guān)聯(lián),表示為一條帶有指向已知類的開放箭頭(不關(guān)閉的箭頭或三角形,用于標(biāo)志繼承)的實(shí)線。如同標(biāo)準(zhǔn)關(guān)聯(lián),單向關(guān)聯(lián)包括一個(gè)角色名和一個(gè)多重值描述,但是與標(biāo)準(zhǔn)的雙向關(guān)聯(lián)不同的時(shí),單向關(guān)聯(lián)只包含已知類的角色名和多重值描述。
簡單的說就是OverdrawAccountReport中包含了BankAccount屬性,而BankAccount中不需要包含OverdrawnAccountsReport對(duì)象
6.聚合的表示:
聚合是一種特別類型的關(guān)聯(lián),用于描述“總體到局部”的關(guān)系。在基本的聚合關(guān)系中, 部分類 的生命周期獨(dú)立于 整體類 的生命周期。
舉例來說,我們可以想象,車 是一個(gè)整體實(shí)體,而 車輪 輪胎是整輛車的一部分。輪胎可以在安置到車時(shí)的前幾個(gè)星期被制造,并放置于倉庫中。在這個(gè)實(shí)例中,Wheel類實(shí)例清楚地獨(dú)立于Car類實(shí)例而存在。然而,有些情況下, 部分 類的生命周期并 不 獨(dú)立于 整體 類的生命周期 -- 這稱為合成聚合。舉例來說,考慮公司與部門的關(guān)系。 公司和部門 都建模成類,在公司存在之前,部門不能存在。這里Department類的實(shí)例依賴于Company類的實(shí)例而存在。
讓我們更進(jìn)一步探討基本聚合和組合聚合。
注意:聚合與普通的關(guān)聯(lián)的區(qū)別在于:普通的關(guān)聯(lián)可能只是一個(gè)簡單的“包含、引用”關(guān)系,關(guān)聯(lián)和被關(guān)聯(lián)類之間在邏輯概念上不一定有緊密的聯(lián)系,而聚合則不同,它表示的是一種內(nèi)在關(guān)系緊密,相互依存,相互包含的概念,其中的一部分是構(gòu)成另外一部分的不可或缺的成分。
·基本聚合
有聚合關(guān)系的關(guān)聯(lián)指出,某個(gè)類是另外某個(gè)類的一部分。在一個(gè)聚合關(guān)系中,子類實(shí)例可以比父類存在更長的時(shí)間。為了表現(xiàn)一個(gè)聚合關(guān)系,你畫一條從父類到部分類的實(shí)線,并在父類的關(guān)聯(lián)末端畫一個(gè)未填充棱形。
圖中清楚的表明了類Car對(duì)象包含了另一類Wheel的4個(gè)實(shí)例,這兩者在概念上是密不可分的,其中的一個(gè)類是另一個(gè)類的構(gòu)成成分。菱形表示“包含”,箭頭表示被包含的對(duì)象,數(shù)字4表示包含的數(shù)目。
·組合聚合
組合聚合關(guān)系是聚合關(guān)系的另一種形式,但是子類實(shí)例的生命周期依賴于父類實(shí)例的生命周期。
注意:組合關(guān)系如聚合關(guān)系一樣繪制,不過這次菱形是被填充的。
7.反射關(guān)聯(lián)的表示:
類也可以使用反射關(guān)聯(lián)與它本身相關(guān)聯(lián)。起先,這可能沒有意義,但是記住,類是抽象的。當(dāng)一個(gè)類關(guān)聯(lián)到它本身時(shí),這并不意味著類的實(shí)例與它本身相關(guān),而是類的一個(gè)實(shí)例與類的另一個(gè)實(shí)例相關(guān)。
圖描繪的關(guān)系說明一個(gè)Employee實(shí)例可能是另外一個(gè)Employee實(shí)例的經(jīng)理。然而,因?yàn)?#8220;manages”的關(guān)系角色有 0..*的多重性描述;一個(gè)雇員可能不受任何其他雇員管理。
三、UML中的對(duì)象圖:
實(shí)例的記號(hào)和類一樣,但是取代頂端區(qū)域中僅有的類名,它的名字是經(jīng)過拼接的:
Instance Name : Class Name 如 Donald : Person
因?yàn)轱@示實(shí)例的目的是顯示值得注意的或相關(guān)的信息,沒必要在你的模型中包含整個(gè)實(shí)體屬性及操作。相反地,僅僅顯示感興趣的屬性及其值是完全恰當(dāng)?shù)摹?/font>

UML 2 也允許在實(shí)體層的關(guān)系/關(guān)聯(lián)建模。繪制關(guān)聯(lián)與一般的類關(guān)系的規(guī)則一樣,除了在建模關(guān)聯(lián)時(shí)有一個(gè)附加的要求。附加的限制是,關(guān)聯(lián)關(guān)系必須與類圖的關(guān)系相一致,而且關(guān)聯(lián)的角色名字也必須與類圖相一致。
四、UML中的角色圖:
建模類的實(shí)例有時(shí)比期望的更為詳細(xì)。有時(shí),你可能僅僅想要在一個(gè)較多的一般層次做類關(guān)系的模型。在這種情況下,你應(yīng)該使用 角色 記號(hào)。角色記號(hào)類似于實(shí)例記號(hào)。為了建立類的角色模型,你畫一個(gè)方格,并在內(nèi)部放置類的角色名及類名,作為實(shí)體記號(hào),但是在這情況你不能加下劃線。

注意:角色圖和對(duì)象圖的一個(gè)明顯區(qū)別就是:對(duì)象圖每個(gè)對(duì)象名稱下面都加了下劃線,而角色圖沒有
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。