http://www.uml.org/
附錄部分不錯(cuò)。
http://www.uml.org.cn/oobject/200504115.htm
UML中的四種機(jī)制使地它簡(jiǎn)單和更易于使用,你可以在UML語(yǔ)言的任何時(shí)候用同樣的方法來(lái)使用,這四種機(jī)制是:
l specifications
l adornments
l common divisions
l extensibility
本章討論adornments和extensibility這兩種機(jī)制。
注釋是最重要的一種修飾。一個(gè)注釋在UML中是一個(gè)圖形符號(hào),描述了和它相關(guān)聯(lián)的元素或一組元素的限制或注釋語(yǔ)。
![]() |
![]() |
上面是一個(gè)使用擴(kuò)充機(jī)制的例子。<<subsystem>>是stereotype,{version = 3.2}是標(biāo)記值
術(shù)語(yǔ)和概念
注釋是一種圖形符號(hào)用來(lái)限制或給一個(gè)元素或一組元素加上注解。注釋畫(huà)成一個(gè)帶折角的矩形,在矩形中加上文字或圖形的注解,
限制是UML元素語(yǔ)義的擴(kuò)充,允許你對(duì)一個(gè)UML元素添加新規(guī)則或修改存在的規(guī)則。限制通常畫(huà)成{}內(nèi)的字符串,放在關(guān)系附近。當(dāng)然,你也可以把限制用注釋來(lái)表示。
通用建模技術(shù)
1. 建模注解
使用注釋的目的是為了讓模型更清晰,下面是使用注釋的一些技巧:
l 將注釋放在你要注解的元素邊上,寫(xiě)下注解的文字。用依賴(lài)關(guān)系的線(xiàn)將注釋和被注釋的元素連起來(lái)會(huì)讓人更明白。
l 記住,你可以隱藏元素或使隱藏的元素可見(jiàn)。這就意味著你可以將注釋不隱藏起來(lái),而她注釋的元素是可見(jiàn)的,這樣會(huì)使你的模型圖簡(jiǎn)潔,在必要的地方讓注釋可見(jiàn)。
l 如果你的注釋很長(zhǎng)或不僅僅是普通文本,你可以將你的注解放到一個(gè)獨(dú)立的外部文件中(如WORD文檔)然后鏈接或嵌入到你的模型中。
下面是一個(gè)使用注解的例子:
![]() |
建立新的建筑塊
UML的建筑塊如:類(lèi)、接口、合作、組件、注釋、關(guān)系等等,都在為具體問(wèn)題建模的時(shí)候基本上是夠用了。然而,如果你想擴(kuò)展你的模型的詞匯,如用來(lái)表示你的特定的問(wèn)題領(lǐng)域,你需要stereotypes。
建立新的建筑塊有如下的技巧:
l 確定沒(méi)有現(xiàn)成的基本的UML方法可以表達(dá)你的需要。如果你碰到一個(gè)普通的建模問(wèn)題,很有可能已經(jīng)有某種標(biāo)準(zhǔn)的stereotype是你想要的。
l 如果你確信沒(méi)有現(xiàn)成的東西可以表達(dá)這些語(yǔ)義,首先找到一個(gè)UML中的最接近你要建立的模型的元素(例如:類(lèi)、接口、組件、注釋、關(guān)系等等)然后為她定義一個(gè)stereotype。值得一提的是你可以定義stereotypes的層次從而得到一般的stereotypes和為它定義的特別的特性。這種方法盡量少用。
l 通過(guò)對(duì)普通的stereotype定義一組標(biāo)記值和對(duì)stereotype進(jìn)行限制可以實(shí)現(xiàn)普通stereotype不能實(shí)現(xiàn)的功能。
l 如果你希望這些stereotype具有不同的視覺(jué)效果,為他們定義一個(gè)特別的圖標(biāo)。
上面是一個(gè)例子。假如你用活動(dòng)圖來(lái)為一個(gè)涉及到教練工作流和隊(duì)員工作流的體育活動(dòng)建模。在這里,區(qū)別教練和運(yùn)動(dòng)員以及與其他的本領(lǐng)域的對(duì)象是有意義的。上面的圖中有兩個(gè)事物是很突出的,教練對(duì)象和隊(duì)員對(duì)象。這里不僅僅是普通的類(lèi),更確切地說(shuō),他們現(xiàn)在是兩個(gè)新的建筑塊。因?yàn)槎x了教練和員stereotype,并且運(yùn)用到了UML的類(lèi)上。在這個(gè)圖上,被標(biāo)記為:Coach和:Team的匿名實(shí)例,后者顯示了不同的狀態(tài)。
建模新屬性
UML建筑塊的基本屬性如:類(lèi)的屬性和操作,包的內(nèi)容等等,都足夠描述清楚你要建立的模型。然而,如果你想擴(kuò)展這些基本建筑塊(或者用stereotype建立的新的建筑塊)的屬性,你就需要使用標(biāo)記值。
下面是一些技巧:
l 首先要確定的是你的需要無(wú)法用基本的UML表達(dá)。如果你碰到一個(gè)普通的建模問(wèn)題,很有可能已經(jīng)有某種標(biāo)準(zhǔn)的標(biāo)記值是你想要的
l 如果你確定沒(méi)有其他的方法可以表達(dá)你需要的語(yǔ)義,添加新的屬性到一個(gè)單獨(dú)的元素或一個(gè)stereotype。繼承的規(guī)則是適用的,也就是說(shuō)對(duì)父親定義的標(biāo)記值對(duì)兒子也具有。
建立新的語(yǔ)義
當(dāng)你用UML建立模型的時(shí)候,你總是使用UML定義的規(guī)則,這實(shí)在是件好事,因?yàn)閯e的懂得如何讀UML的人可以毫無(wú)偏差地讀懂你想要表達(dá)的東西。然而,如果你發(fā)現(xiàn)你需要表達(dá)的語(yǔ)義是UML無(wú)法表達(dá)的或你想要修改UML的規(guī)則,這時(shí)你就需要使用限制了。下面是使用限制的一些技巧:
l 首先要確定的是你的需要無(wú)法用基本的UML表達(dá)。如果你碰到一個(gè)普通的建模問(wèn)題,很有可能已經(jīng)有某種標(biāo)準(zhǔn)的限制是你想要的。
l 如果你確定沒(méi)有其他的方法可以表達(dá)你需要的語(yǔ)義,用文本的形式在限制中寫(xiě)下你的新語(yǔ)義,并且將他放在他涉及的元素附近。你可以使用依賴(lài)關(guān)系來(lái)明確地表示限制和他涉及的元素之間的關(guān)聯(lián)。
l 如果你需要詳細(xì)說(shuō)明你的語(yǔ)義,你可以用使用OCL把它寫(xiě)下來(lái)。
下面的圖是一個(gè)公司人力資源系統(tǒng)的一小部分:
這副圖顯示了每個(gè)Person可能是0個(gè)或多個(gè)Department的成員。每個(gè)Department至少要有一個(gè)Person成員。這副圖進(jìn)一步說(shuō)明每個(gè)Department嚴(yán)格地有一個(gè)Person作為管理者,每個(gè)Person可以是0個(gè)或多個(gè)Department的被管理人員。所有的這些語(yǔ)義可以被簡(jiǎn)單的UML表達(dá)。然而,為了指出一個(gè)管理者必須也是Department的成員是多員關(guān)系所忽略的,也是簡(jiǎn)單的UML無(wú)法表達(dá)的。為了表達(dá)這種關(guān)系,你必須寫(xiě)下一個(gè)限制指出管理者是Department成員的一個(gè)子集。從子集到超集用依賴(lài)關(guān)系將兩個(gè)關(guān)系聯(lián)系起來(lái)。
http://www.uml.org.cn/UMLApplication/UMLApplication30.htm
在Java中保留Stereotype
作者:仙人掌工作室 本文選自:賽迪網(wǎng)
在前面兩篇文章中(《用UML描述Java類(lèi)》和《在UML中表示Java繼承和接口》),我們比較了在Java編程語(yǔ)言以及UML建模語(yǔ)言這兩種環(huán)境中,類(lèi)以及類(lèi)之間關(guān)系在表達(dá)方式以及概念方面的差異。下面我們要來(lái)看看UML Stereotype機(jī)制對(duì)于編寫(xiě)Java代碼的影響。
UML擁有一系列可用來(lái)擴(kuò)展其核心概念的機(jī)制,但最為人們熟知的也許就是Stereotype。Stereotype一般譯作“構(gòu)造型”,它是一種擴(kuò)展元模型語(yǔ)義的建模元素。構(gòu)造型必須基于元模型中特定的現(xiàn)有類(lèi)型或類(lèi)。構(gòu)造型可擴(kuò)展已有類(lèi)型和類(lèi)的語(yǔ)義,但不能改動(dòng)它們的結(jié)構(gòu)。構(gòu)造型默認(rèn)的表示方法是在關(guān)鍵詞周?chē)由霞饨请p括號(hào),這種雙括號(hào)在某些歐洲語(yǔ)言中自然存在,因?yàn)樗芟髢蓚€(gè)尖括號(hào),所以用兩個(gè)尖括號(hào)也是一種被認(rèn)可的表示方式。
構(gòu)造型幾乎適用于UML中的任何元素,包括類(lèi)、屬性、操作以及關(guān)聯(lián)等。例如,我們可以用構(gòu)造型來(lái)顯示UML圖中一個(gè)類(lèi)別的類(lèi)。圖一顯示了用構(gòu)造型來(lái)表示State設(shè)計(jì)模式中一個(gè)類(lèi)扮演的角色,改編自《Design Patterns》一書(shū)。UML定義了大量的標(biāo)準(zhǔn)構(gòu)造型,我們既可以使用這些標(biāo)準(zhǔn)構(gòu)造型,也可以定義自己的構(gòu)造型。
圖一中的MessageStatus接口本來(lái)應(yīng)該讓interface這個(gè)詞位于尖括號(hào)之內(nèi)。但是,為了把接口和其他構(gòu)造型區(qū)分出來(lái),用來(lái)制作本文UML圖的Together ControlCenter工具已予以省略。這是因?yàn)榻涌谂c其他構(gòu)造型不同,“在UML元模型中接口也具有與類(lèi)相似的特性”。
直到UML1.4之前(20001年9月),UML中的一個(gè)圖形元素只能有一個(gè)構(gòu)造型。但在UML 1.4中,OMG(對(duì)象管理組織)取消了這個(gè)限制,現(xiàn)在一個(gè)圖形元素可以有多個(gè)構(gòu)造型。許多UML工具由于未能跟上這一變化,所以仍沒(méi)有提供這方面的支持。
那么,構(gòu)造型對(duì)于我們的Java代碼又有何影響呢?從某種意義上講,答案是“完全沒(méi)有”,因?yàn)镴ava沒(méi)有提供任何讓我們按照這種方式對(duì)類(lèi)進(jìn)行分類(lèi)的手段(前面幾篇文章已經(jīng)討論了接口和繼承,在UML中它們都有自己特定的表示方法)。但是,另一方面,我們可以利用構(gòu)造型更清楚、明白地說(shuō)明Java代碼的含義:首先約定構(gòu)造型的具體意義,然后在源代碼注釋中以一個(gè)新的javadoc標(biāo)記的形式包含構(gòu)造型,有效地減少為了說(shuō)明Java代碼含義而需要手工編寫(xiě)的說(shuō)明文字?jǐn)?shù)量。下面的代碼片斷就是圖一Sent類(lèi)的骨架代碼,構(gòu)造型以一個(gè)定制javadoc標(biāo)記的形式加入到了注釋之中:
在UML中,并非只有類(lèi)可以通過(guò)指定構(gòu)造型而約束其定義。圖二顯示了兩個(gè)類(lèi)之間的依賴(lài)關(guān)系,用構(gòu)造型來(lái)表示這種依賴(lài)關(guān)系的類(lèi)型。在這個(gè)例子中,F(xiàn)actory類(lèi)的對(duì)象負(fù)責(zé)創(chuàng)建Item類(lèi)的對(duì)象。Factory類(lèi)的代碼顯示了定制的javadoc標(biāo)記如何用構(gòu)造型來(lái)簡(jiǎn)潔明了地說(shuō)明這種依賴(lài)關(guān)系。
符號(hào)說(shuō)明:在前面的文章中,我們看到了三種類(lèi)之間的關(guān)系,這里出現(xiàn)的是第四種。關(guān)聯(lián)關(guān)系用一根實(shí)線(xiàn)加上開(kāi)叉的箭頭表示(如果關(guān)聯(lián)關(guān)系是單向的話(huà)),一般化關(guān)系用實(shí)線(xiàn)加上封閉的箭頭(從子類(lèi)指向超類(lèi))表示,Realization關(guān)系用虛線(xiàn)加上封閉的箭頭(從實(shí)現(xiàn)接口的類(lèi)指向接口)表示。現(xiàn)在我們看到了第四種箭頭與線(xiàn)型的組合:虛線(xiàn)加上開(kāi)叉箭頭表示的依賴(lài)關(guān)系。
操作和屬性同樣可以指定構(gòu)造型。如圖三所示,兩個(gè)操作被加注了構(gòu)造型,用來(lái)表示它們是否會(huì)修改屬性的值。與圖三對(duì)應(yīng)的源代碼同樣利用定制的javadoc標(biāo)記說(shuō)明該方法的構(gòu)造型信息。
在java源代碼中加上了描述構(gòu)造型信息的定制javadoc標(biāo)記之后,好處不僅僅在于減少了需要手工編寫(xiě)的注釋?zhuān)沂沟肬ML工具有可能處理這些標(biāo)記并完成下面這類(lèi)任務(wù):
從Java源代碼重新生成(比沒(méi)有定制javadoc標(biāo)記的情況下)更加完整的UML圖。
在Javadoc生成的文檔中增加額外的信息。
例如,本文所用的建模工具TogetherSoft的Together ControlCentre,就是用這種方法來(lái)保留各種無(wú)法直接在Java源代碼中保留的UML類(lèi)圖語(yǔ)義信息。
本文開(kāi)頭提到,尖括號(hào)是顯示構(gòu)造型的默認(rèn)方式。實(shí)際上,構(gòu)造型還可以用改變圖形符號(hào)或形狀的方式表示。圖四的例子顯示了兩個(gè)帶有
在類(lèi)圖中使用替代符號(hào)表示構(gòu)造型有一個(gè)很大的缺點(diǎn),如果有些人不熟悉類(lèi)圖用到的符號(hào),要理解類(lèi)圖表達(dá)的是什么意思就很困難了。另外,多一種符號(hào),理解圖形的負(fù)擔(dān)就增加一分。在這個(gè)系列的文章中,我們只關(guān)注那些最常見(jiàn)的UML類(lèi)圖符號(hào)。
除了用改變符號(hào)形狀的方法來(lái)表示已經(jīng)指定了某種構(gòu)造型之外,我們還可以通過(guò)改變圖形元素的顏色或紋理來(lái)表達(dá)同樣的信息。運(yùn)用色彩意味著我們可以保留常規(guī)的圖形形狀和符號(hào),同時(shí)又能表達(dá)出與改變形狀同樣多的視覺(jué)信息(如果不是更多的話(huà))。另外,與抽象的形狀相比,簡(jiǎn)單的配色方案一般更容易掌握一些。
圖五的彩色類(lèi)圖運(yùn)用了Peter Coad等人的四色原型(Archetype)組合來(lái)定義類(lèi)。
粉紅色的
黃色的
綠色的類(lèi)可進(jìn)一步分成
第四種原型是藍(lán)色的catalog-entry-like-description(簡(jiǎn)稱(chēng)
屬于特定原型的類(lèi)具有或多或少相似的屬性和行為,屬于同一原型的類(lèi)還會(huì)傾向于以通常而言可預(yù)測(cè)的方式與其他原型的類(lèi)交互。這些特征和行為模式可以幫助我們快速構(gòu)造出健壯的、可擴(kuò)展的對(duì)象模型,迅速掌握有可能被忽略的屬性和操作,增強(qiáng)我們對(duì)代碼結(jié)構(gòu)的信心。圖五顯示了我們可能在各種原型的類(lèi)中找到的屬性和操作,以及各種原型之間的典型關(guān)系。
結(jié)束語(yǔ):在這篇文章中,我們了解了對(duì)于UML中一些很有用的概念,如果它在Java語(yǔ)言中沒(méi)有直接的等價(jià)概念,如何在Java代碼中利用UML的這些概念來(lái)保留高層次的設(shè)計(jì)思想。在下一篇文章中,我們將告別UML類(lèi)圖,轉(zhuǎn)而討論UML另一種重要的圖形——交互圖,包括序列圖和協(xié)作圖。