markdown工具鏈plantuml:像寫代碼一樣繪制 UML 模型-時列圖
概述
序列圖具有直觀、形象的特點,對於理清、呈現對象之間的交互關系非常有幫助。在UML建模中,時序圖中包括的建模元素主要有:對象(Actor)、生命線(Lifeline)、控制焦點(Focus of control)、消息(Message)等。
- 角色: 可以是人或者系統;
- 對象:指系統中某個模塊、類、類的實例等,對象的命名包含三種方式:1)
對象:類名;2):類名;3)對象名。通常,為作圖清晰,對象的排列遵循以下兩個原則:1)把交互頻繁的對象盡可能的靠攏;2)把初始化整個交互活動的對象放置在最左端; - 生命線:從對象圖標向下延伸的一條虛線,表示對象存在的時間;
- 控制焦點:又稱為激活期,表示時間段的符號,在這個時間段內對象將執行相應的操作。它可以被理解成C語言語義中一對花括號
{ }中的內容;用小矩形表示; - 消息:用於對象間傳遞信息,消息代表的是責任分配而不是數據流動,消息名稱中不用帶“請求二次”,因為消息箭頭已經包含有請求的意思。例如,A指向B是指A調用B做某事,做某事是B的一個責任。消息可分為:
- 1)同步消息(Synchronous Message):又稱調用消息,消息的發送者把控制傳遞給消息的接收者,然后停止活動,等待消息的接收者放棄或者返回控制。用來表示同步的意義;
- 2)異步消息(Asynchronous Message):消息發送者通過消息把信號傳遞給消息的接收者,然后繼續自己的活動,不等待接受者返回消息或者控制。異步消息的接收者和發送者是並發工作的;
- 3)返回消息(Return Message): 返回消息表示從過程調用返回;
- 4)自關聯消息(Self-Message): 表示方法的自身調用以及一個對象內的一個方法調用另外一個方法。
上述各個建模元素使用 plantuml 語言示意如下:
@startuml
actor 角色
activate 對象1
角色 -> 對象1
對象1 -> 對象2 : 同步消息
對象2 --> 對象1 : 返回消息1
對象1 o-> 對象2 : 異步消息
對象1 -> 對象1 : 自關聯消息
@enduml

一般異步消息開始點使用圓圈表示
角色、對象(參與者)
UML中, 角色可以是人或者系統;對象 指系統中某個模塊、類、類的實例等,對象的命名包含三種方式:1)對象:類名;2):類名;3)對象名。通常,為作圖清晰,對象的排列遵循以下兩個原則:1)把交互頻繁的對象盡可能的靠攏;2)把初始化整個交互活動的對象放置在最左端;
UML角色與對象在 plantuml 中都是參與者。
聲明參與者
plantuml 使用如下關鍵字actor, boundary, control, entity, database聲明參與者:
@startuml
actor actor
boundary boundary
control control
entity entity
database database
@enduml

- 可以使用
<<和>>給參與者添加構造類型。在構造類型中,可以使用(X,color)格式的語法添加一個圓圈圈起來的字符; - 可以使用
participant改變參與者的先后順序與顏色。 - 可以使用引號定義參與者,此時參與者可以使用特殊字符。
@startuml
participant A << (C,#ADD1B2) Test >> order 2 #red
participant B order 1 #99ff99
A -> B
B -> "C()" : 測試
@enduml

order 值越小,越靠前。
包裹參與者
plantuml 可以使用 box 和 end box 畫一個盒子將參與者包裹起來。 還可以在 box 關鍵字之后添加標題或者背景顏色。
@startumlA
box "帖子管理" #LightBlue
participant 添帖模塊
participant 查詢模塊
end box
participant 數據庫
添帖模塊 -> 查詢模塊 : 查詢帖子
查詢模塊 -> 數據庫 : 查詢數據庫
@enduml

外觀參數
plantuml 用 skinparam 改變字體和顏色。
可以在如下場景中使用:
- 在圖示的定義中,
- 在引入的文件中,
- 在命令行或者ANT任務提供的配置文件中。
@startuml
skinparam backgroundColor #EEEBDC
skinparam handwritten true
skinparam sequence {
ArrowColor DeepSkyBlue
ActorBorderColor DeepSkyBlue
LifeLineBorderColor blue
LifeLineBackgroundColor #A9DCDF
ParticipantBorderColor DeepSkyBlue
ParticipantBackgroundColor DodgerBlue
ParticipantFontName Impact
ParticipantFontSize 17
ParticipantFontColor #A9DCDF
ActorBackgroundColor aqua
ActorFontColor DeepSkyBlue
ActorFontSize 17
ActorFontName Aapex
}
box "帖子管理" #LightBlue
participant 添帖模塊
participant 查詢模塊
end box
participant 數據庫
添帖模塊 -> 查詢模塊 : 查詢帖子
查詢模塊 -> 數據庫 : 查詢數據庫
@enduml

生命線
UML 中,生命線是從對象圖標向下延伸的一條虛線,表示對象存在的時間。
時延與空間
在 plantuml 中,可以使用...來表示延遲,並且可以給延遲添加注釋;可以使用 ||| 來增加空間。可以使用數字指定增加的像素的數量。
@startuml
帖子管理模塊 -> 數據庫: 認證請求
...
帖子管理模塊 <-- 數據庫: 返回碼
...5 分鍾后...
數據庫 <- 帖子管理模塊 : 斷開連接
||45||
數據庫 --> 帖子管理模塊 : 再見
@enduml
控制焦點(激活期)
控制焦點,又稱為激活期,表示時間段的符號,在這個時間段內對象將執行相應的操作。它可以被理解成C語言語義中一對花括號{ }中的內容;用小矩形表示;
在plantuml中,關鍵字 activate用來表示參與者的生命活動,一旦參與者被激活,就進入激活期。使用 deactivate 退出生命期。
還可以使用嵌套的生命線,並且運行給生命線添加顏色。可以使用destroy銷毀生命線。
@startuml
participant 用戶
用戶 -> 帖子管理模塊: 發帖
activate 帖子管理模塊 #FFBBBB
帖子管理模塊 -> 帖子管理模塊: 內部調用
activate 帖子管理模塊 #DarkSalmon
帖子管理模塊 o-> 數據庫: << 創建表項 >>
activate 數據庫
deactivate 帖子管理模塊
數據庫 --> 帖子管理模塊: 返回碼
destroy 數據庫
@enduml

消息
UML序列圖中,消息用於對象間傳遞信息,消息代表的是責任分配而不是數據流動,消息名稱中不用帶“請求二次”,因為消息箭頭已經包含有請求的意思。例如,A指向B是指A調用B做某事,做某事是B的一個責任。消息可分為:
- 1)同步消息(Synchronous Message):又稱調用消息,消息的發送者把控制傳遞給消息的接收者,然后停止活動,等待消息的接收者放棄或者返回控制。用來表示同步的意義;
- 2)異步消息(Asynchronous Message):消息發送者通過消息把信號傳遞給消息的接收者,然后繼續自己的活動,不等待接受者返回消息或者控制。異步消息的接收者和發送者是並發工作的;
- 3)返回消息(Return Message): 返回消息表示從過程調用返回;
- 4)自關聯消息(Self-Message): 表示方法的自身調用以及一個對象內的一個方法調用另外一個方法。
進入和發出消息
在 plantuml 中,如果只想關注部分圖示,你可以使用進入和發出箭頭。 使用方括號 [和] 表示圖示的左、右兩側。
@startuml
[-> 帖子管理 : 發帖
帖子管理 ->] : 刪除某個表項
帖子管理 <--] : 錯誤碼
@enduml

箭頭
在 plantuml 中,可以修改箭頭的樣式、顏色。
1. 修改箭頭樣式的方式有以下幾種:
- 表示一條丟失的消息,末尾加
x; - 讓箭頭只有上半部分或者下半部分:將
<和>替換成\或者/; - 細箭頭:將箭頭標記寫兩次 (
如 >> 或 //) ; - 虛線箭頭:用
--替代-; - 箭頭末尾加圈:
->o; - 雙向箭頭:
<->。
2. 可以使用記號修改箭頭顏色:A -[#red]> B;
@startuml
A -> B : 正常消息
A ->x B : 丟失的消息
A ->> B : 小箭頭消息
A -\ B : 單箭頭消息
A -/ B : 單箭頭消息
A o-> B : 圓點箭頭消息
A ->o B : 圓點箭頭消息
A -[#blue]> B : 修改箭頭顏色
@enduml

消息編號
在 plantuml 中,通過關鍵字 autonumber start_num step 給消息自動編號;
可通過在雙引號內指定編號的格式,格式是由 Java 的 DecimalFormat 類實現的:(0 表示數字;# 也表示數字,但默認為 0)。也可以用HTML標簽來制定格式。
可以使用autonumber stop停止使用編號。
@startuml
autonumber
A -> B : 編號的消息
autonumber 10 5
A -> B : 編號1的消息
A -> B : 編號4的消息
autonumber "<b>[000]"
A -> B : 3位編號
autonumber 15 "<b>(<u>##</u>)"
A -> B : 2位編號
autonumber 20 "<font color=red><b> 消息 0 :"
A -> B : 紅色消息
@enduml

組合消息
在 plantuml 中,可以通過關鍵字alt, opt, loop, group, par, critical聲明組合消息。
- alt: 抉擇,用來指明在兩個或更多的消息序列之間的互斥的選擇,相當於經典的
if..else..。
抉擇在任何場合下只發生一個序列。 可以在每個片段中設置一個臨界來指示該片段可以運行的條件。else的臨界指示其他任何臨界都不為 True 時應運行的片段。如果所有臨界都為 False 並且沒有 else,則不執行任何片段。
@startuml
alt 查詢成功
發帖模塊 -> 查貼模塊 : 查詢
return 帖子ID
else 查詢失敗小於3次
發帖模塊 -> 查貼模塊 : 查詢
查貼模塊 -> 查貼模塊 : 重試
else 查詢失敗大於3次
發帖模塊 -> 查貼模塊 : 查詢
return 查詢錯誤碼
end
@enduml

- opt :選項,包含一個可能發生或不發生的序列
@startuml
opt 查詢頻率超過 1000次/s
發帖模塊 -> 查貼模塊 : 查詢
return 返回拒絕服務碼
end
@enduml

- loop,循環
@startuml
loop 每周一
員工 -> 主管 : 匯報
return 安排工作
end
@enduml

- group: 后面緊跟着消息內容,表示一個序列組
@startuml
group 發帖操作
actor 用戶
用戶 -> 發帖模塊 : 發貼
發帖模塊 -> 數據庫 : 查詢數據庫
return 查詢結果
發帖模塊 -> 數據庫 : 添加數據庫
return 添加成功
end
@enduml

- par:並行,表示兩個消息可以並行就行,不同消息使用
else隔開。
@startuml
客人 -> 廚師 : 點菜
activate 廚師
par
廚師 -> 廚師 : 炒菜
else
廚師 -> 廚師 : 燉湯
end
@enduml

- critical: 關鍵,用在 Par 或 Seq 片段中。 指示此片段中的消息不得與其他消息交錯。
注釋
在 plantuml 中,可以通過在消息后面添加 note left of 對象 或者 note right of 對象 關鍵詞來給消息添加注釋;
可以使用 end note 來添加多行注釋;
可以使用 rnote或者 hnote代替 note,分別表示 矩形 與 六邊形
可以在 note 的后面添加 #顏色,改變 note 的顏色。
@startuml
發帖模塊 -> 數據庫 : 添加
note right of 發帖模塊
需要用戶密碼認證
end note
發帖模塊 -> 數據庫 : 刪除
hnote right of 發帖模塊 #aqua
需要用戶密碼認證
end note
@enduml

分割
可以使用 == 關鍵字 == 分割消息為不同的部分
@startuml
發帖模塊 -> 數據庫 : 添加
note right of 發帖模塊
需要用戶密碼認證
end note
== 關鍵字 ==
發帖模塊 -> 數據庫 : 刪除
hnote right of 發帖模塊 #aqua
需要用戶密碼認證
end note
@enduml

參考
- plantuml 中文教程
- 軟件方法:業務建模與需求 潘加宇
- planttext線上編輯plantuml
- UML建模之時序圖(Sequence Diagram)
- UML建模(時序圖)
- UML序列圖總結(Loop、Opt、Par和Alt)
NFVschool 微信公共號,關注最前沿的網絡技術。

