UML 教程

UML 結(jié)構(gòu)建模圖

關(guān)鍵詞:部署圖, 組件圖, 包圖, 類圖, 復(fù)合結(jié)構(gòu)圖, 對象圖, 活動圖, 狀態(tài)機(jī)圖, 用例圖, 通信圖, 交互概述圖, 時序圖, 時間圖

簡介

UML 圖類型

UML 圖類型如下圖所示:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-diagrams.png"/></div>

結(jié)構(gòu)式建模圖

結(jié)構(gòu)式建模圖(Structure diagrams)強(qiáng)調(diào)的是系統(tǒng)式的建模。結(jié)構(gòu)圖定義了一個模型的靜態(tài)架構(gòu)。它們通常被用來對那些構(gòu)成模型的‘要素'建模,諸如:類,對象,接口和物理組件。另外,它們也被用來對元素間關(guān)聯(lián)和依賴關(guān)系進(jìn)行建模。

行為式建模圖

行為式建模圖(Behavior diagrams)強(qiáng)調(diào)系統(tǒng)模型中觸發(fā)的事。行為圖用來記錄在一個模型內(nèi)部,隨時間的變化,模型執(zhí)行的交互變化和瞬間的狀態(tài);并跟蹤系統(tǒng)在真實環(huán)境下如何表現(xiàn),以及觀察系統(tǒng)對一個操作或事件的反應(yīng),以及它的結(jié)果。

UML 概念

UML 從來源中使用相當(dāng)多的概念。我們將之定義于統(tǒng)一建模語言術(shù)語匯表。下面僅列代表性的概念。

  • 對于結(jié)構(gòu)而言 - 執(zhí)行者,屬性,類,元件,接口,對象,包。
  • 對于行為而言 - 活動(UML),事件(UML),消息(UML),方法(UML),操作(UML),狀態(tài)(UML),用例(UML)。
  • 對于關(guān)系而言 - 聚合,關(guān)聯(lián),組合,相依,廣義化(or 繼承)。
  • 其他概念
    • 構(gòu)造型—這規(guī)范符號應(yīng)用到的模型
    • 多重性—多重性標(biāo)記法與資料庫建模基數(shù)對應(yīng),例如:1, 0..1, 1..*

部署圖

部署圖(Deployment Diagram)用于對系統(tǒng)的物理結(jié)構(gòu)建模。部署圖將顯示系統(tǒng)中的軟件組件和硬件組件之間的關(guān)系以及處理工作的物理分布。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-deployment-diagram-example.png"/></div>

節(jié)點

節(jié)點既可以是硬件元素,也可以是軟件元素。它顯示為一個立方體,如下圖所示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-node.gif"/></div>

節(jié)點實例

圖可以顯示節(jié)點實例,實例與節(jié)點的區(qū)分是:實例的名稱帶下劃線,冒號放在它的基本節(jié)點類型之前。實例在冒號之前可以有名稱,也可以沒有名稱。下圖顯示了一個具名的計算機(jī)實例。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-node-instance.gif"/></div>

節(jié)點構(gòu)造型

為節(jié)點提供了許多標(biāo)準(zhǔn)的構(gòu)造型,分別命名為 ?cdrom?, ?cd-rom?, ?computer?, ?disk array?, ?pc?, ?pc client?, ?pc server?, ?secure?, ?server?, ?storage?, ?unix server?, ?user pc?。 并在節(jié)點符號的右上角顯示適當(dāng)?shù)膱D標(biāo)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-node-stereotype.gif"/></div>

工件

工件是軟件開發(fā)過程中的產(chǎn)品。包括過程模型(如:用例模型,設(shè)計模型等),源文件,執(zhí)行文件,設(shè)計文檔,測試報告,構(gòu)造型,用戶手冊等等。

工件表示為帶有工件名稱的矩形,并顯示?artifact?關(guān)鍵字和文檔符號。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-artifact.gif"/></div>

關(guān)聯(lián)

在部署圖的上下文聯(lián)系中,關(guān)聯(lián)代表節(jié)點間的聯(lián)系通道。下圖顯示了一個網(wǎng)絡(luò)系統(tǒng)的部署圖,描述了網(wǎng)絡(luò)協(xié)議為構(gòu)造型和關(guān)聯(lián)終端的多重性,


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-network-model.gif"/></div>

作為容器的節(jié)點

節(jié)點可以包含其他元素,如組件和工件。下圖顯示了一個嵌入式系統(tǒng)某個部分的部署圖。描寫了一個被主板節(jié)點包含的可執(zhí)行工件。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-embedded-model.gif"/></div>

組件圖

組件圖(Component Diagram)描繪了組成一個軟件系統(tǒng)的模塊和嵌入控件。組件圖比類圖具有更高層次的抽象-通常運(yùn)行時一個組件被一個或多個類(或?qū)ο螅崿F(xiàn)。它們象積木那樣使得組件能最終構(gòu)成系統(tǒng)的絕大部分。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-component-diagram.gif"/></div>

上圖演示了一些組件和它們的內(nèi)部關(guān)系。裝配連接器(Assembly connectors)“連接”由"Product"和"Customer"的提供接口到由 "Order"指定的需求接口。 一個依賴關(guān)系映射了客戶相關(guān)的帳戶信息到“Order”需要的 "Payment"需求接口。

實際上,組件圖同包圖很相似,它們都有明確的界限,把元素分組到邏輯結(jié)構(gòu)中。他們之間的不同是:組件圖提供了語義更豐富的分組機(jī)制,在組件圖中,所有的模型元素都是私有的,而包圖只顯示公有的成員。

表現(xiàn)組件

組件可表示為帶關(guān)鍵字 ?component?的矩形類元;也可用右上角有組件圖標(biāo)的矩形表示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-representing-components.gif"/></div>

裝配連接器

裝配連接器在組件 “Component1”的需求接口和另一個組件 “Component2”的提供接口之間建立橋梁; 這個橋梁使得一個組件能提供另一個組件所需要的服務(wù)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-required-interfaces.gif"/></div>

帶端口組件

使用端口的組件圖允許在它的環(huán)境指定一個服務(wù)和行為,同時這個服務(wù)和行為也是組件需要的。當(dāng)端口進(jìn)行雙向操作的時候,它可以指定輸入和輸出。下圖詳述了用于在線服務(wù)的帶端口組件,它有兩個提供接口 “order entry”和 “tracking”,也有 “payment” 需求接口。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-component-with-ports.gif"/></div>

包圖

包圖(Package Diagram)用來表現(xiàn)包和它所包含元素的組織。當(dāng)用來代表類元素時,包圖提供了命名空間的可視化。包圖最常用的用途是用來組織用例圖和類圖,盡管它不局限于這些 UML 元素。

下面是一個包圖的例子。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-package-diagram.gif"/></div>

包中的元素共享相同的命名空間,因此,一個指定命名空間的元素必須有唯一的名稱。

包可以用來代表物理或邏輯關(guān)系。選擇把類包括在指定的包里,有助于在同一個包里賦予這些類相同繼承層次。通常認(rèn)為把通過復(fù)合相關(guān)聯(lián)的類,以及與它們相協(xié)作的類放在同一個包里。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-package.gif"/></div>

在 UML2.5 中,包用文件夾來表示,包中的元素共享同一個命名空間,并且必須是可識別的,因此要有唯一的名稱或類型。包必須顯示包名,在附屬方框部分有選擇的顯示包內(nèi)的元素。

  • 包的合并 - 包之間的合并連接符?merge?定義了源包元素與目標(biāo)包同名元素之間的泛化關(guān)系。源包元素的定義被擴(kuò)展來包含目標(biāo)包元素定義。當(dāng)源包元素與目標(biāo)包內(nèi)沒有同名元素時,目標(biāo)包元素的定義不受影響。
  • 包的導(dǎo)入 - 導(dǎo)入連接符 ?import?表明目標(biāo)包的元素,在該例中是一個類 ,在源包中被引用要用非限定修飾名。源包的命名空間獲得目標(biāo)類的接口,目標(biāo)包的命名空間則不受影響。
  • 嵌套連接符 - 源包和目標(biāo)包間的嵌套連接符說明目標(biāo)包完全包含源包。

類圖

類圖(Class Diagram)展示了面向?qū)ο笙到y(tǒng)的構(gòu)造模塊。描繪了模型或部分模型的靜態(tài)視圖,顯示它包含的屬性和行為,而不是詳細(xì)描述操作的功能或完善方法。類圖最常用來表達(dá)多個類和接口之間的關(guān)系。泛化(Generalizations),聚合(aggregations)和關(guān)聯(lián)(associations)分別是類之間繼承,復(fù)合或應(yīng)用,及連接的表現(xiàn)。

下面的圖顯示了類之間的聚合關(guān)系。弱聚合(淺色箭頭)表現(xiàn)在類 "Account" 使用 "AddressBook",但是不必要包含它的一個實例。強(qiáng)聚合(圖中的黑色箭頭)表示了目標(biāo)類包含源類,例如,"Contact" 和 "ContactGroup"值被包含在 "AddressBook"中。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-class-diagram.png"/></div>

類(Classes)

類是定義對象所具有的屬性和行為的元素。行為用類能理解的合適消息和適合每條消息的操作來描述。 類中也可能定義約束,標(biāo)記值,構(gòu)造型。

類的標(biāo)柱(Class Notation)

類用矩形表示。除類的名稱外,還可以選擇性地顯示屬性和操作。 分欄分別用來顯示類的名稱,屬性和操作。

在下面圖中,類的類名顯示在最上面的分欄,它下面的分欄顯示詳細(xì)屬性,如:"center" 屬性顯示初始化的值。最后面的分欄顯示操作,如: setWidth,setLength 和 setPosition 以及他們的參數(shù)。 屬性和操作名前的標(biāo)注表示了該屬性或操作的可見性: 如果使用 "+"號,這個屬性或操作是公共的 ; "-" 號則代表這個屬性或操作是私有的。 "#"號是這個屬性或操作被定義為保護(hù)的," ~" 號代表包的可見性。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-class.gif"/></div>

接口(Interfaces)

接口是實施者同意滿足的行為規(guī)范,是一種約定。實現(xiàn)一個接口,類必需支持其要求的行為,使系統(tǒng)按照同樣的方式,即公共的接口,處理不相關(guān)的元素。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-class-interface.gif"/></div>

接口有相似于類的外形風(fēng)格,含有指定的操作,如下圖所示。如果沒有明確的詳細(xì)操作,也可以畫成一個圓環(huán)。當(dāng)畫成圓環(huán)的時候,到這個環(huán)形標(biāo)柱的實現(xiàn)連接沒有目標(biāo)箭頭。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-interface.gif"/></div>

表(Tables)

表盡管不是基本 UML 的一部分,仍然是“圖型”能完成的實例用。在右上角畫一個表的小圖標(biāo)來表示。表屬性用“圖型” ?column?表示。 絕大多數(shù)表單有一個主鍵,是由一個或幾個字段組成的一個唯一的字碼組合加主鍵操作來訪問表格,主鍵操作“圖型”為?PK?。 一些表有一個或多個外鍵,使用一個或多個字段加一個外鍵操作,映射到相關(guān)表的主鍵上去,外鍵操作“圖型”為?FK?。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-table.gif"/></div>

關(guān)聯(lián)(Associations)

關(guān)聯(lián)表明兩個模型元素之間有關(guān)系,通常用在一個類中被實現(xiàn)為一個實例變量。連接符可以包含兩端的命名的角色,基數(shù)性,方向和約束。關(guān)聯(lián)是元素之間普通的關(guān)系。如果多于兩個元素,也可以使用菱形的關(guān)聯(lián)關(guān)系。當(dāng)從類圖生成代碼時,關(guān)聯(lián)末端的對象將變成目標(biāo)類中實例變量。見下圖示例 "playsFor" 將變成"Player"類中的實例變量。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-associations.gif"/></div>

泛化(Generalizations)

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


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-generalizations.gif"/></div>

下圖顯示了與上圖相同信息的視圖。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-generalizations-02.gif"/></div>

聚合(Aggregations)

聚合通常被用來描述由更小的組件所構(gòu)成的元素。聚合關(guān)系表示為白色菱形箭頭指向目標(biāo)類或父類。

聚合的更強(qiáng)形式 -組合聚合(強(qiáng)聚合) - 顯示為黑色菱形箭頭,用來組合每次最大化的包含組件。如果一個組合聚合的父類被刪除,通常與他相關(guān)的所有部分都會被刪除,但是,如果一個部件從組合中去掉,將不用刪除整個組合。組合是可遷,非對稱的關(guān)系和遞歸的。

下面的圖示:顯示了弱聚合和強(qiáng)聚合的不同。“ address book” 由許多 “contacts” 和 “contact groups”組成。 “contact group” 是一個“contacts”的虛分組; “contact”可以被包含在不止一個 “ contact group”。 如果你刪除一個“ address book”,所有的 “contacts” 和 “contact groups” 也將會被刪除;如果你刪除“ contact group”, 沒有 “contacts”會被刪除。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-aggregations.gif"/></div>

關(guān)聯(lián)類(Association Classes)

關(guān)聯(lián)類是一個允許關(guān)聯(lián)連接有屬性和操作的構(gòu)造。下面的示例:顯示了遠(yuǎn)不止簡單連接兩個類的連接,如給“employee”分配項目?!?employee”在項目中所起的作用是一個復(fù)雜的實體,既有自身的也有不屬于“employee” 或 “project” 類的細(xì)節(jié)。 例如,“ employee”可以同時為幾個項目工作,有不同的職務(wù)頭銜和對應(yīng)的安全權(quán)限。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-association-classes.gif"/></div>

依賴(Dependencies)

依賴被用來描述模型元素間廣泛的依賴關(guān)系。通常在設(shè)計過程早期顯示兩個元素之間存在某種關(guān)系,因為是初期而不能確定具體是什么關(guān)系,在設(shè)計過程末期,該繼承關(guān)系會被歸入已有構(gòu)造型 (構(gòu)造型 可以是實例化 ?instantiate?,跟蹤 ?trace?,導(dǎo)入 ?import?, 和其它的關(guān)系),或被替換成一個更明確類型的連接符。

跟蹤(Traces)

跟蹤關(guān)系是一種特殊化的依賴關(guān)系。連接模型元素或跨模型但是具有相同概念的模型元素集。跟蹤被經(jīng)常用來追蹤需求和模型的變化。由于變化是雙向的,這種依賴關(guān)系的順序通常被忽略。這種關(guān)系的屬性可以被指定為單向映射,但跟蹤是雙向的,非正式的和很少可計算的。

實現(xiàn)(Realizations)

是源對象執(zhí)行或?qū)崿F(xiàn)目標(biāo),實現(xiàn)被用來表達(dá)模型的可跟蹤性和完整性-業(yè)務(wù)模型或需求被一個或多個用例實現(xiàn),用例則被類實現(xiàn),類被組件實現(xiàn),等等。這種實現(xiàn)貫穿于系統(tǒng)設(shè)計的映射需求和類等,直至抽象建模水平級。從而確保整個系統(tǒng)的一張宏圖,它也反映系統(tǒng)的所有微小組成,以及約束和定義它的細(xì)節(jié)。實現(xiàn)關(guān)系用帶虛線的實箭頭表示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-realizations.gif"/></div>

嵌套(Nestings)

嵌套連接符用來表示源元素嵌套在目標(biāo)元素中。下圖顯示“ inner class”的定義,盡管在 EA 中,更多地按照著他們在項目層次視圖中的位置來顯示這種關(guān)系。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-nestings.gif"/></div>

復(fù)合結(jié)構(gòu)圖

復(fù)合結(jié)構(gòu)圖顯示類的內(nèi)部結(jié)構(gòu),包括它與系統(tǒng)其他部分的交互點。也顯示各部分的配置與關(guān)系,這些部分一起執(zhí)行類元的行為。

類元素已經(jīng)在類圖部分被詳細(xì)地闡述,這部分用來說明類表現(xiàn)復(fù)合元素的方式,如:暴露接口,包含端口和部件。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-composite-structure-diagram.gif"/></div>

部件

部件是代表一組(一個或多個)實例的元素,這組實例的擁有者是一類元實例,例如:如果一個圖的實例有一組圖形元素,則這些圖形元素可以被表示為部件,并可以對他們之間的某種關(guān)系建模。注意:一個部件可以在它的父類被刪除之前從父類中被去掉,這樣部件就不會被同時刪除了。
部件在類或組件內(nèi)部顯示為不加修飾的方框。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-part.gif"/></div>

端口

端口是類型化的元素,代表一個包含類元實例的外部可視的部分。端口定義了類元和它的環(huán)境之間的交互。端口顯示在包含它的部件,類或組合結(jié)構(gòu)的邊緣上。端口指定了類元提供的服務(wù),以及類元要求環(huán)境提供的服務(wù)。
端口顯示為所屬類元邊界指定的方框。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-port.gif"/></div>

接口

接口與類相似,但是有一些限制,所有的接口操作都是公共和抽象的,不提供任何默認(rèn)的實現(xiàn)。所有的接口屬性都必須是常量。然而,當(dāng)一個類從一個單獨的超級類繼承而來,它可以實現(xiàn)多個接口。
當(dāng)一個接口在圖中單列出來,它既可以顯示為類元素的方框,帶 ?interface? 關(guān)鍵字和表明它是抽象的斜體名稱,也可以顯示為圓環(huán)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-interface.gif"/></div>

注意:圓環(huán)標(biāo)注不顯示接口操作。當(dāng)接口顯示為類所有的接口,它們會被當(dāng)作暴露接口引用。暴露接口可以定義為是提供的,還是需求的。提供接口確認(rèn)包含它的類元提供指定接口元素定義的操作,可通過類和接口間實現(xiàn)的連接來定義。需求接口說明該類元能與其他類元進(jìn)行通信,這些類元提供了指定接口元素所定義的操作。需求接口可通過在類和接口間建立依賴連接來定義。
提供接口顯示為“帶棒球體”,依附在類元邊緣。需求接口顯示為“帶棒杯體”,也是依附在類元邊緣。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-interface-02.gif"/></div>

委托

委托連接器用來定義組件外部端口和接口的內(nèi)部工作方式。委托連接器表示為帶有 ?delegate? 關(guān)鍵字的箭頭。它連接組件的外部約定,表現(xiàn)為它的端口,到組件部件行為的內(nèi)部實現(xiàn)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-delegate.gif"/></div>

協(xié)作

協(xié)作定義了一系列共同協(xié)作的角色,它們集體展示一個指定的設(shè)計功能。協(xié)作圖應(yīng)僅僅顯示完成指定任務(wù)或功能的角色與屬性。隔離主要角色是用來簡化結(jié)構(gòu)和澄清行為,也用于重用。一個協(xié)作通常實現(xiàn)一個模式。
協(xié)作元素顯示為橢圓。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-collaboration.gif"/></div>

角色綁定

角色綁定連接器是一條從連接協(xié)作到所要完成該任務(wù)類元的連線。它顯示為虛線,并在類元端顯示作用名。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-role-binding.gif"/></div>

表現(xiàn)

表現(xiàn)連接器用于連接協(xié)作到類元來表示此類元中使用了該協(xié)作。顯示為帶關(guān)鍵字 ?represents?的虛線箭頭。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-represent.gif"/></div>

發(fā)生
發(fā)生連接器用于連接協(xié)作到類元來表示此協(xié)作表現(xiàn)了(同原文)該類元;顯示為帶關(guān)鍵字?occurrence?的虛線箭頭。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-occurrence.gif"/></div>

對象圖

對象圖(Object Diagram)可以認(rèn)為是類圖的特殊情形,是類圖元素子集,被用來及時強(qiáng)調(diào)在某些點,類的實例間的關(guān)系。這對理解類圖很有幫助。他們在構(gòu)造上與類圖顯示沒有不同,但是反映出多樣性和作用。

類和對象元素

下面的圖顯示了類元素和對象元素外觀上的不同。注意:類元素包括三個部分,分別是名字欄,屬性欄和操作欄;對象元素默認(rèn)為沒有分欄。名稱顯示也有不同:對象名稱有下劃線,并可能顯示該對象實例化所用類元的名稱。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-object.gif"/></div>

運(yùn)行狀態(tài)

類元元素可以有任意數(shù)量的屬性和操作。在對象實例中不會被顯示出來。但可能定義對象的運(yùn)行狀態(tài),顯示特殊實例的屬性設(shè)置值。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-run-time-state.gif"/></div>

類和對象圖示例

下圖是一個對象圖,其中插入了類定義圖。它例示如何用對象圖來測試類圖中任務(wù)多重性的方法?!癱ar” 類對 “wheel” 類有“1 對多” 的多重性,但是如果已經(jīng)選擇用“1 對 4” 來替代,那樣就不會在對象圖顯示“3 個輪子”的汽車。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-object-diagram.gif"/></div>

活動圖

UML 中,活動圖用來展示活動的順序。顯示了從起始點到終點的工作流,描述了活動圖中存在于事件進(jìn)程的判斷路徑。活動圖可以用來詳細(xì)闡述某些活動執(zhí)行中發(fā)生并行處理的情況?;顒訄D對業(yè)務(wù)建模也比較有用,用來詳細(xì)描述發(fā)生在業(yè)務(wù)活動中的過程。
一個活動圖的示例如下所示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-diagram.gif"/></div>

下面描述組成活動圖的元素。

活動

活動是行為參數(shù)化順序的規(guī)范?;顒颖槐硎緸閳A角矩形,內(nèi)含全部的動作,工作流和其他組成活動的元素。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity.gif"/></div>

動作

一個動作代表活動中的一個步驟。動作用圓角矩形表示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-action.gif"/></div>

動作約束

動作可以附帶約束,下圖顯示了一個帶前置條件和后置條件的動作。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-conditions.gif"/></div>

控制流

控制流顯示一個動作到下一個動作的流。表示為帶箭頭實線


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-edge.gif"/></div>

初始節(jié)點

一個開始或起始點用大黑圓點表示,如下圖。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-initial.gif"/></div>

結(jié)束節(jié)點

結(jié)束節(jié)點有兩種類型:活動結(jié)束節(jié)點和流結(jié)束節(jié)點?;顒咏Y(jié)束節(jié)點表示為中心帶黑點的圓環(huán)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-final.gif"/></div>

流結(jié)束節(jié)點表示為內(nèi)部為叉號的圓環(huán)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-flow-final.gif"/></div>

這兩種不同類型節(jié)點的區(qū)別為:流結(jié)束節(jié)點表明單獨的控制流的終點?;顒咏Y(jié)束終點是活動圖內(nèi)所有控制流的結(jié)束。

對象和對象流

對象流是對象和數(shù)據(jù)轉(zhuǎn)遞的通道。對象顯示為矩形。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-object.gif"/></div>

對象流顯示為帶箭頭的連接器,表明方向和通過的對象。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-object-flow.gif"/></div>

一個對象流在它的至少一個終端有一個對象。在上圖中,可以采用帶輸入輸出引腳的速記標(biāo)柱表示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-object-flow-alt.gif"/></div>

數(shù)據(jù)存儲顯示為帶 ?datastore? 關(guān)鍵字的對象。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-data-store.gif"/></div>

判斷節(jié)點和合并節(jié)點

判斷節(jié)點和合并節(jié)點是相同標(biāo)注:菱形。它們可以被命名。從判斷節(jié)點出來的控制流有監(jiān)護(hù)條件,當(dāng)監(jiān)護(hù)條件滿足時,可以對流控制。下圖顯示了判斷節(jié)點和合并節(jié)點的使用。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-decision-or-merge.gif"/></div>

分叉和結(jié)合節(jié)點

分叉和結(jié)合節(jié)點有同樣的標(biāo)柱:垂直或水平條(方向取決于工作流從左到右,還是從上到下)。它們說明了控制的并發(fā)線程的起始和終點,下圖顯示他們的使用示例。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-fork-and-join.gif"/></div>

結(jié)合節(jié)點與合并節(jié)點不同之處在于:結(jié)合節(jié)點同步兩個輸入量,產(chǎn)生一個單獨的輸出量。來自結(jié)合節(jié)點的輸出量要接收到所有的輸入量后才能執(zhí)行。合并節(jié)點直接將控制流傳遞通過。如果兩個或更多的輸入量到達(dá)合并節(jié)點。則它的輸出流指定的動作會被執(zhí)行兩次或更多次。

擴(kuò)展域

擴(kuò)展域是會執(zhí)行多次的結(jié)構(gòu)活動域。輸入輸出擴(kuò)展節(jié)點表示為一組“3 廂” ,代表多個選擇項。關(guān)鍵詞 "iterative", "parallel" 或 "stream"顯示在區(qū)域的左上角


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-expansion-region.gif"/></div>

異常處理器

異常處理器在活動圖中可以建模。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-exception-handler.gif"/></div>

可中斷活動區(qū)

可中斷活動區(qū)環(huán)繞一組可以中斷的動作。在下面非常簡單的例子中: 當(dāng)控制被傳遞到結(jié)束訂單 "Close Order" 動作,定單處理"Process Order" 動作會執(zhí)行直到完成,除非"Cancel Request"取消請求中斷被接受,這會將控制傳遞給"Cancel Order"動作。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-interruptible-activity-region.gif"/></div>

分割

一個活動分割顯示為垂直或水平泳道。在下圖中,分割被用來在活動圖中分隔動作,有在 "accounting department"中執(zhí)行的,有在 "customer"中執(zhí)行的。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-activity-partitions.gif"/></div>

狀態(tài)機(jī)圖

狀態(tài)機(jī)圖(state-machine-diagram)對一個單獨對象的行為建模,指明對象在它的整個生命周期里,響應(yīng)不同事件時,執(zhí)行相關(guān)事件的順序。

如下示例, 下列的狀態(tài)機(jī)圖顯示了門在它的整個生命周期里如何運(yùn)作。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-diagram.gif"/></div>

門可以處于以下的三種狀態(tài)之一: "Opened"打開狀態(tài), "Closed"關(guān)閉狀態(tài),或者"Locked"鎖定狀態(tài)。 它分別響應(yīng)事件:“Open”開門, “Close”關(guān)門, “Lock”鎖門 和 “Unlock”解鎖。 注意:不是所有的事件,在所有的狀態(tài)下都是有效的。如:一個門打開的時候是不可能鎖定的,除非你關(guān)上門。并且,狀態(tài)轉(zhuǎn)移可能有附加監(jiān)護(hù)條件:假設(shè)門是開的,如果“doorWay->isEmpty”(門是空的)被滿足,那么它只能響應(yīng)關(guān)門事件。狀態(tài)機(jī)圖使用的語法和約定將在下面的部分進(jìn)行討論。

狀態(tài)

狀態(tài)被表示為圓角矩形,狀態(tài)名寫在里面。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state.gif"/></div>

起始和結(jié)束狀態(tài)

初始狀態(tài)表示為實心黑圓環(huán),可以標(biāo)注名稱。結(jié)束狀態(tài)表示為中心帶黑點圓環(huán),也可以被標(biāo)注名稱。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-initial-and-final.gif"/></div>

轉(zhuǎn)移

一個狀態(tài)到下一個狀態(tài)的轉(zhuǎn)移表示為帶箭頭實線。轉(zhuǎn)移可以有一個“Trigger”觸發(fā)器,一個“Guard”監(jiān)護(hù)條件和一個“effect”效果。如下所示:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-transition.gif"/></div>

"Trigger"觸發(fā)器是轉(zhuǎn)移的起因,它可以是某個條件下的一個信號,一個事件,一個變化或一個時間通路。"Guard"監(jiān)護(hù)是一個條件,而且必須為真,以便于讓觸發(fā)器引起轉(zhuǎn)移。效果"Effect"是直接作用到對象上的一個動作,該對象具有做為轉(zhuǎn)移結(jié)果的狀態(tài)機(jī)。

狀態(tài)活動

在上面的狀態(tài)轉(zhuǎn)移示例中,一個效果與該轉(zhuǎn)移相關(guān)聯(lián)。如果目標(biāo)狀態(tài)有多個轉(zhuǎn)移到達(dá),并且每一個轉(zhuǎn)移都有相同的效果與它相關(guān)聯(lián),那最好將該效果與目標(biāo)狀態(tài)相關(guān)聯(lián),而不與轉(zhuǎn)移相關(guān)聯(lián)。你可以通過為這個狀態(tài)定義初始動作來實現(xiàn)。下圖顯示了一個帶入口動作和出口動作的狀態(tài)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-entry-and-exit.gif"/></div>

可以定義發(fā)生在事件上的動作或一直發(fā)生的動作。每一種類型的動作是可以定義任意數(shù)量的。

自轉(zhuǎn)移

一個狀態(tài)可能有一個返回到自身的轉(zhuǎn)移,如下圖。效果與轉(zhuǎn)移關(guān)聯(lián)是十分有幫助。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-self-transition.gif"/></div>

復(fù)合狀態(tài)

一個狀態(tài)機(jī)圖可以有子狀態(tài)機(jī)圖,如下圖所示:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-compound.gif"/></div>

可選擇不同方式顯示相同信息,如下圖所示:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-composite.gif"/></div>

上面版本的標(biāo)注說明"Check PIN"的子狀態(tài)機(jī)圖顯示在單獨的圖中。

入口點

有時,你不想在正常的初始狀態(tài)進(jìn)入子狀態(tài)機(jī)。例如下面的子狀態(tài)機(jī),它通常從"初始化"狀態(tài)開始,但是如果因為某些原因,它不必執(zhí)行初始化,可能靠轉(zhuǎn)移到指定的入口點來從 "Ready" 狀態(tài)開始。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-entry-point.gif"/></div>

下圖顯示了狀態(tài)機(jī)的上一層。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-entry-point-higher.gif"/></div>

出口點

有與入口點相類似的方式,它可能也指定可選擇的出口點。下圖給出了主處理狀態(tài)執(zhí)行后,所執(zhí)行狀態(tài)的去向?qū)⑷Q于該狀態(tài)轉(zhuǎn)移時所使用的路徑。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-exit-point.gif"/></div>

選擇偽狀態(tài)

選擇偽狀態(tài)顯示為菱形,有一個轉(zhuǎn)移輸入,兩個或多個輸出。下圖顯示不管到達(dá)哪一個狀態(tài),經(jīng)過選擇偽狀態(tài)后的去向,取決于在偽狀態(tài)中執(zhí)行時所選擇的消息格式。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-choice.gif"/></div>

連接偽狀態(tài)

連接偽狀態(tài)用來將多個狀態(tài)轉(zhuǎn)移鏈接在一起。一個單獨的連接偽狀態(tài)可以有一個或多個輸入和一個或多個輸出,監(jiān)護(hù)可能應(yīng)用于每一個轉(zhuǎn)移,連接是沒有語義的。連接可以把一個輸入轉(zhuǎn)移分成多個輸出轉(zhuǎn)移來實現(xiàn)一個靜態(tài)分支。與之對照的是選擇偽狀態(tài)實現(xiàn)一個動態(tài)條件分支。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-junction.gif"/></div>

終止偽狀態(tài)

進(jìn)入終止偽狀態(tài)是指狀態(tài)機(jī)生命線已經(jīng)終止。終止偽狀態(tài)表示為叉號。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-terminate.gif"/></div>

歷史狀態(tài)

歷史狀態(tài)用來當(dāng)狀態(tài)機(jī)中斷時,恢復(fù)狀態(tài)機(jī)之前狀態(tài)。下面例圖說明了歷史狀態(tài)的使用。這個例子是關(guān)于洗衣機(jī)的狀態(tài)機(jī)。

在這個狀態(tài)機(jī)中,當(dāng)洗衣機(jī)運(yùn)行時,它會按照"Washing" 到 Rinsing"再到"Spinning"來進(jìn)行。如果電源被切斷 ,洗衣機(jī)會停止運(yùn)行并進(jìn)入"Power Off" 狀態(tài)。當(dāng)電源恢復(fù),運(yùn)行狀態(tài)在"History State"符號處進(jìn)入,表示它會從上次離開的地方恢復(fù)。

并發(fā)區(qū)

一個狀態(tài)可以被分成幾個不同的區(qū),包含同時存在和執(zhí)行的子狀態(tài)。下面的例子顯示狀態(tài) "Applying Brakes", "front brake"和"rear brakes" 將同時獨立運(yùn)作。注意使用了分叉和結(jié)合偽狀態(tài)而不是選擇和合并偽狀態(tài)。這些符號用來同步并發(fā)的線程。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-concurrent-regions.gif"/></div>

用例圖

用例圖用來記錄系統(tǒng)的需求,它提供系統(tǒng)與用戶及其他參與者的一種通信手段。

執(zhí)行者

用例圖顯示了系統(tǒng)和系統(tǒng)外實體之間的交互。這些實體被引用為執(zhí)行者。執(zhí)行者代表角色,可以包括:用戶,外部硬件和其他系統(tǒng)。執(zhí)行者往往被畫成簡筆畫小人。也可以用帶?actor?關(guān)鍵字的類矩形表示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-actor.gif"/></div>

在下圖中,執(zhí)行者可以詳細(xì)的泛化其他執(zhí)行者:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-generalize.gif"/></div>

用例

用例是有意義的單獨工作單元。它向系統(tǒng)外部的人或事提供一個易于觀察的高層次行為視圖。 用例的標(biāo)注符號是一個橢圓。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case.gif"/></div>

使用用例的符號是帶可選擇箭頭的連接線,箭頭顯示控制的方向。下圖說明執(zhí)行者 "Customer"使用 "Withdraw"用例。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-use.gif"/></div>

用途連接器(uses connector)可以有選擇性的在每一個端點有多重性值,如下圖,顯示客戶一次可能只執(zhí)行一次取款交易。但是銀行可以同時執(zhí)行許多取款交易。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-multiplicity-use.gif"/></div>

用例定義

一個典型的用例包括:

  • 名稱和描述 - 用例通常用一個動詞詞組定義,而且有一個簡短的文字說明。
  • 需求 - 需求定義了一個用例必須提供給終端用戶的正式功能性需求。它們符合構(gòu)造方法建立的功能性規(guī)范。一個需求是用例將執(zhí)行一個動作或提供多個值給系統(tǒng)的約定或承諾。
  • 約束 - 一個約束是一個用例運(yùn)行的條件或限制。它包括:前置條件,后置條件和不變化條件 。前置條件指明了用例在發(fā)生之前需要符合的條件。后置條件用來說明在用例執(zhí)行之后一些條件必須為"真"。不變化條件說明用例整個執(zhí)行過程中該條件始終為"真"。
  • 情形 - 情形是用例的實例在執(zhí)行過程中,事件發(fā)生流程的形式描述。它定義了系統(tǒng)和外部執(zhí)行者之間的事件指定順序。通常用文本方式來表示,并對應(yīng)時序圖中的文字描述。
  • 情形圖
  • 附加信息

包含用例

用例可能包含其他用例的功能來作為它正常處理的一部分。通常它假設(shè),任何被包含的用例在基本程序運(yùn)行時每一次都會被調(diào)用。下面例子:用例“卡的確認(rèn)”<Card Identification> 在運(yùn)行時,被用例“取錢”<Withdraw>當(dāng)作一個子部分。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-include.gif"/></div>

用例可以被一個或多個用例包含。通過提煉通用的行為,將它變成可以多次重復(fù)使用的用例。有助于降低功能重復(fù)級別。

擴(kuò)展用例

一個用例可以被用來擴(kuò)展另一個用例的行為,通常使用在特別情況下。例如:假設(shè)在修改一個特別類型的客戶訂單之前,用戶必須得到某種更高級別的許可,然后“獲得許可”<Get Approval>用例將有選擇的擴(kuò)展常規(guī)的“修改訂單”<Modify Order>用例。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-extend.gif"/></div>

擴(kuò)展點 - 擴(kuò)展用例的加入點被定義為擴(kuò)展點。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-extend-with-condition.gif"/></div>

系統(tǒng)邊界 - 它用來顯示用例在系統(tǒng)內(nèi)部,執(zhí)行者在系統(tǒng)的外部。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-use-case-system-boundary.gif"/></div>

通信圖

通信圖,以前稱之為協(xié)作圖,是一種交互圖,所顯示消息與時序圖相似,但是它更側(cè)重于對象間的聯(lián)系

在通信圖中,對象之間顯示關(guān)聯(lián)連接器。消息附加到這些關(guān)聯(lián)上,顯示短箭頭指向消息流的方向。消息的順序通過編號碼顯示。

下面的兩個圖用通信圖和時序圖分別顯示相同的信息。盡管我們可能從通信圖的編號碼得到消息順序,但它不是立即可見的。通信圖十分清楚的顯示了鄰近對象間全部完整的消息傳遞。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-communications-diagram.gif"/></div>


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-diagram.gif"/></div>

交互概述圖

一個交互概覽圖是活動圖的一種形式,它的節(jié)點代表交互圖。交互圖包含時序圖,通信圖,交互概覽圖和時間圖。 大多數(shù)交互概覽圖標(biāo)注與活動圖一樣。例如:起始,結(jié)束,判斷,合并,分叉和結(jié)合節(jié)點是完全相同。并且,交互概覽圖介紹了兩種新的元素:交互發(fā)生和交互元素。

交互發(fā)生

交互發(fā)生引用現(xiàn)有的交互圖。顯示為一個引用框,左上角顯示 "ref" 。被引用的圖名顯示在框的中央。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-interaction-overview-01.gif"/></div>

交互元素

交互元素與交互發(fā)生相似之處在于都是在一個矩形框中顯示一個現(xiàn)有的交互圖。不同之處在內(nèi)部顯示參考圖的內(nèi)容不同。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-interaction-overview-02.gif"/></div>

將它們放在一起

所有的活動圖控件,都可以相同地被使用于交互概覽圖,如:分叉,結(jié)合,合并等等。它把控制邏輯放入較低一級的圖中。下面的例子就說明了一個典型的銷售過程。子過程是從交互發(fā)生抽象而來。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-interaction-overview-diagram.gif"/></div>

時序圖

時序圖是交互圖的一種形式,它顯示對象沿生命線發(fā)展,對象之間隨時間的交互表示為從源生命線指向目標(biāo)生命線的消息。時序圖能很好地顯示那些對象與其它那些對象通信,什么消息觸發(fā)了這些通信,時序圖不能很好顯示復(fù)雜過程的邏輯。

生命線

一條生命線在時序圖中代表一個獨立的參與者。表示為包含對象名的矩形,如果它的名字是"self",則說明該生命線代表控制帶時序圖的類元。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-lifelines.gif"/></div>

有時,時序圖會包含一個頂端是執(zhí)行者的生命線。這情況說明掌握這個時序圖的是用例。健壯圖中的邊界,控制和實體元素也可以有生命線。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-more-lifelines.gif"/></div>

消息

消息顯示為箭頭。消息可以完成傳輸,也可能丟失和找回,它可以是同步的,也可以是異步的,即可以是調(diào)用,也可以是信號。在下圖中,第一條消息是同步消息(標(biāo)為實箭頭)完成傳輸,并隱含一條返回消息。第二條消息是異步消息 (標(biāo)為實線箭頭),第三條是異步返回消息(標(biāo)為虛線)。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-messages.gif"/></div>

執(zhí)行發(fā)生

向下延伸的細(xì)條狀矩形表示執(zhí)行事件或控制焦點的激活。在上圖中有三個執(zhí)行事件。第一個是源對象發(fā)送兩條消息和收到兩條回復(fù)。第二個是目標(biāo)對象收到一條同步消息并返回一條回復(fù)。第三個是目標(biāo)對象收到一條異步消息并返回一條回復(fù)。

內(nèi)部通信

內(nèi)部消息表現(xiàn)為一個操作的遞歸調(diào)用,或一個方法調(diào)用屬于同一個對象的其他方法。顯示為生命線上執(zhí)行事件的嵌套控制焦點。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-recursion.gif"/></div>

迷路消息和拾取消息

迷路消息是那些發(fā)送了卻沒有到達(dá)指定接收者,或者到達(dá)的接收者不再當(dāng)前圖中。拾取消息是收到來自那些未知的發(fā)送者,或者來自沒有顯示在當(dāng)前圖的發(fā)送者的消息。它們都表明是去往或來自一個終點元素。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-lost-and-found.gif"/></div>

生命線開始與結(jié)束

生命線可以在時序圖時間刻度范圍內(nèi)創(chuàng)建和銷毀,在下面的例子中,生命線被停止符號(叉號)終止。在前面的例子中,生命線頂端的符號(Child)顯示在比創(chuàng)建它的對象符號(parent)沿頁面要低的位置上。下圖顯示創(chuàng)建和終止對象。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-lost-and-found.gif"/></div>

時間和期限約束

消息默認(rèn)顯示為水平線。因為生命線顯示為沿屏幕向下的時間通道,所以當(dāng)給實時系統(tǒng)建模,或是有時間約束的業(yè)務(wù)過程建模,考慮執(zhí)行動作所需時間長度是很重要的。因此可以給消息設(shè)置一個期限約束,這樣的消息顯示為下斜線。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-time.gif"/></div>

復(fù)合片段

如前面所說,時序圖不適合表達(dá)復(fù)雜的過程邏輯。在一種情況下,有許多機(jī)制允許把一定程度的過程邏輯加入到圖中,并把它們放到復(fù)合片段的標(biāo)題下。復(fù)合片段是一個或多個處理順序被包含在一個框架中,并在指定名稱的環(huán)境下執(zhí)行。片段可以是:

  • 選擇性片段 (顯示 “alt”) 為 if…then…else 結(jié)構(gòu)建模。
  • 選項片段 (顯示 “opt”) 為 "switch"(開關(guān)) 結(jié)構(gòu)建模。
  • 中斷片段對被處理事件的可選擇順序建模,而不是該圖的其他部分。
  • 并行片段(顯示 “par”) 為并發(fā)處理建模。
  • 弱順序片段 (顯示 “seq”) 包含了一組消息,這組消息必須在后繼片段開始之前被處理。但不會把片段內(nèi)消息的先后順序強(qiáng)加到不共享同一條生命線的消息上。
  • 嚴(yán)格順序片段 (顯示 “strict”) 包含了一系列需要按照給定順序處理的消息。
  • 非片段 (顯示 “neg”) 包含了一系列不可用的消息。
  • 關(guān)鍵片段 具有關(guān)鍵部分。
  • 忽略片段 聲明一個沒有意義的消息,如果它出現(xiàn)在當(dāng)前上下文中。
  • 考慮片段與忽略片段相反,不包含在考慮片段內(nèi)的消息都應(yīng)該被忽略。
  • 斷言片段 (顯示 “assert”)標(biāo)明任何沒有顯示為聲明操作數(shù)的順序都是無效的。
  • 循環(huán)片段 包含一系列被重復(fù)的消息。

下圖顯示的是循環(huán)片段:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-fragment.gif"/></div>

這也是一個類似于復(fù)合片段的交互發(fā)生。 交互發(fā)生被其他圖參考,顯示為左上角帶"ref",將被參考圖名顯示在方框的中間。

門是連接片段內(nèi)消息和片段外消息的連接點。 在 EA 中,門顯示為片段框架上的小正方形。作用為時序圖與頁面外的連接器。 用來表示進(jìn)來的消息源,或者出去消息的終點。下面兩個圖顯示它們在實踐中的使用。注意:" top level diagram"中的門用消息箭頭指向參考片段,在這里沒有必要把它畫成方塊。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-top-level-diagram.gif"/></div>


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-nested-diagram.gif"/></div>

部分分解

一個對象可以引出多條生命線,使得對象內(nèi)部和對象之間的消息顯示在同一圖上。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-part-decomposition.gif"/></div>

狀態(tài)常量/延續(xù)

狀態(tài)常量是生命線的約束,運(yùn)行時始終為"真"。顯示為兩側(cè)半圓的矩形,如下圖:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-sequence-state-invariant.gif"/></div>

延續(xù)雖與狀態(tài)常量有同樣的標(biāo)注,但是被用于復(fù)合片段,并可以延伸跨越多條生命線。

時間圖

UML 時間圖被用來顯示隨時間變化,一個或多個元素的值或狀態(tài)的更改。也顯示時控事件之間的交互和管理它們的時間和期限約束。

狀態(tài)生命線

狀態(tài)生命線顯示隨時間變化,一個單項狀態(tài)的改變。不論時間單位如何選擇,X 軸顯示經(jīng)過的時間,Y 軸被標(biāo)為給出狀態(tài)的列表。狀態(tài)生命線如下所示:


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-state-lifeline.gif"/></div>

值生命線

值生命線顯示隨時間變化,一個單項的值的變化。X 軸顯示經(jīng)過的時間,時間單位為任意,和狀態(tài)生命線一樣。平行線之間顯示值,每次值變化,平行線交叉。如下圖所示。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-value-lifeline.gif"/></div>

將它們放在一起

狀態(tài)和值的生命線能疊加組合。它們必須有相同的 X 軸。 消息可以從一個生命線傳遞到另一個。每一個狀態(tài)和值的變換能有一個定義的事件,一個時間限制是指一個事件何時必須發(fā)生,和一個期限限制說明狀態(tài)或值多長時間必須有效。一旦這些已經(jīng)被應(yīng)用,其時間圖可能顯示如下。


<div align="center"><img src="https://raw.githubusercontent.com/dunwu/images/master/images/design/uml/uml-timing-diagram.gif"/></div>

UML 工具

UML 工具非常多,到底哪種工具好,真的是仁者見仁智者見智。這里列舉一些我接觸過的 UML 工具:

億圖

國內(nèi)開發(fā)的、收費(fèi)的繪圖工具。圖形模板、素材非常全面,樣式也很精美,可以導(dǎo)出為 word、pdf、圖片。

億圖官網(wǎng)


<div align="center"><img src="http://www.edrawsoft.cn/images/software/createsoftware.png"/></div>

Visio

Office 的繪圖工具,特點是簡單、清晰。

Visio 官網(wǎng)


<div align="center"><img src="https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE2jMC4?ver=5361&q=90&h=675&w=830&b=%23FFFFFFFF&aim=true"/></div>

StarUML

樣式精美,功能全面的 UML 工具。

StarUML 官網(wǎng)


<div align="center"><img src="http://staruml.io/image/screenshot_jumbotron.png"/></div>

Astah

樣式不錯,功能全面的繪圖工具。

Astah 官網(wǎng)


<div align="center"><img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539757904141&di=7e4f71d0a00ffcd87e0e5aa62f0ed168&imgtype=jpg&src=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D3525476819%2C2924170461%26fm%3D214%26gp%3D0.jpg"/></div>

ArgoUML

UML 工具。

ArgoUML 官網(wǎng)


<div align="center"><img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f4e8a7c6923df8dcb23087c3ac7819ee/8b13632762d0f70315a83ced05fa513d2697c5ed.jpg"/></div>

ProcessOn

在線繪圖工具,特點是簡潔、清晰。

ProcessOn 官網(wǎng)

drawio

開源的在線繪圖工具,特點是簡潔、清晰。

drawio 官網(wǎng)

更多內(nèi)容

本文已歸檔到:https://github.com/dunwu/notes

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容