時序圖
時序圖(Sequence Diagram)描述了對象之間傳遞消息的時間順序,它用來表示用例中的行為順序,是強調消息時間順序的交互圖。時序圖描述類系統中類和類之間的交互,它将這些交互建模成消息交換。也就是說,時序圖描述了類以及類間相互交換以完成期望行為
時序圖的基本元素
時序圖包括了5個基本元素,分别是對象(Object)、生命線(Lifeline)、激活(Activation)、和消息(Message)。
對象(Object):表示參與交互的對象。每個對象都帶有一條生命周期線,對象被激活(創建或者被引用)時,生命周期線上會出現一個長條(會話),表示對象的存在。将對象置于時序圖的頂部意味着在交互開始的時候對象就已經存在了,如果對象的位置不在頂部,那麼表示對象是在交互的過程中被創建的。對象一般包含以下三種命名方式:
- 第一種方式包含對象名和類名。
- 第二種方式隻顯示類名不顯示對象名,即為一個匿名對象。
- 第三種方式隻顯示對象名不顯示類名。
生命線(Lifeline): 生命線是一條垂直的虛線,表示時序圖中的對象在一段時間内的存在。每個對象的底部中心的位置都帶有生命線。生命線是一個時間線,從時序圖的頂部一直延伸到底部,所用的時間取決于交互持續的時間。對象與生命線結合在一起稱為對象的生命線;對象的生命線包含對象圖标以及圖标下面的生命線
激活(Activation)和去激活(Deactivation):時序圖通過激活條來描述對象的激活(Activation)和去激活(Deactivation)。激活代表時序圖中的對象執行一項操作的時期。激活期可以被理解成C語言語義中一對花括号“{}”中的内容。激活表示該對象被占用以完成某個任務,去激活指的是對象處于空閑狀态,在等待消息。在UML中,為了表示對象是激活的,可以将對象的生命線拓寬成為矩形,圖中的矩形稱為激活條,對象就是在激活條的頂部被激活的。對象在完成自己的工作後被去激活,這通常發生在一個消息箭頭離開對象生命線的時候。
消息(Message):消息由一個對象的生命周期線指向另一個對象的生命周期線。如果消息指到空白的生命周期線,将創建一個新的會話;如果消息指到已有的會話,表示該對象延續已有會話。
- 同步消息(Message):也可以簡稱消息。同步消息适用于大多數情況。一般情況下使用同步消息就足夠了,除非在設計模型的類交互時需要強調消息類型時才使用其他消息類型。同步消息表示發出消息的對象将停止所有後續動作一直等到接收消息方響應。同步消息将阻塞源消息對象的所有行為。同步消息最為常用,通常程序之間的方法調用都是同步消息。

333
- 返回消息(Reply Message)。返回消息為源消息的返回體,而非新的消息。一般來說不需要為每個源消息都繪制返回消息,一方面因為默認情況下源消息都有返回,另一方面太多的返回消息會使圖變得更複雜。

33
- 異步消息(Async Message)。異步消息類似一次異步調用,本身主流程不會被這次調用阻塞,但需要等到了異步消息的回調。

33
- 創建消息(Create Message)。實際含義是創建對象的消息,這個消息指向對象以後,對象的位置就不會出現在頂部,而是創建消息所在的位置

- 删除消息(Delete Message)。實際含義就是銷毀對象的消息。會在指向對象激活的生命線的終止點,也就是删除消息指向的地步打一個"X",表示對象被删除。

- 異步信号消息(Async Signal Message)。這裡要解釋一下信号和消息不同之處。信号不同于其他消息類型的地方在于:當一個對象接收到信号時,該對象不需要返回任何信息,隻需按照它的接收信号指定的行為執行相應的操作。源消息對象發出信号後不等待響應,而可以繼續執行其他操作。異步信号消息一般需要消息中間件的支持,如JMS、MQ等。

- 自關聯消息。特殊類型的Message。消息的調用方和被調用方是同一個Object。

時序圖的高級元素
掌握了時序圖的基本元素以後就能繪制出主要的時序邏輯。但對象和對象直接的交互往往是很複雜的,會出現條件判斷、輪訓等待、異常處理等情況,時序圖要“精确的”表達出來,這些基本元素就不夠了,需要借助時序圖的高級元素。
組合片段(Combined Fragments) :Fragments的意思是片段。在時序圖中用于表示緊密相連有邏輯關系的片段。片段内的内容是完整不可拆分的。主要的片段類型有以下幾種
- 選擇(alt):包含一個片段列表,這些片段包含備選消息序列。 在任何場合下隻發生一個序列。可以在每個片段中設置一個臨界來指示該片段可以運行的條件。 else 的臨界指示其他任何臨界都不為 True 時應運行的片段。 如果所有臨界都為 False 并且沒有 else,則不執行任何片段。

333

- 循環(Loop)片段重複一定次數。 可以在臨界中指示片段重複的條件。

- 中斷(Break):如果執行此片段,則放棄序列的其餘部分。 可以使用臨界來指示發生中斷的條件,可以和Loop配合使用。下圖中先進行的是循環,滿足條件就break結束循環。

- 并行(par):并行處理。 片段中的事件可以并行執行。

- 臨界(Critical):指示此片段中的消息不得與其他消息交錯,可以理解成需要加鎖單線程訪問,例如庫存扣減的處理。

- 忽略(ignore)和考慮(consider):ignore:明确定義了交互片段不應該響應的消息;consider:明确标志了應該被處理的消息。比如說A和B直接交互的消息有Message1、Message2、Message3、Message4這4種類型,當需要對Message1以外所有的消息都要相應處理的場景可以使用忽略(Ignore),而隻對Message1或Message2的時候就可以用考慮(Consider)。

- neg:用來标志不應該發生的交互。例如你上傳一個文件,網絡超時應該是一種特例,不應該發生。

- 斷言(assert):标志了在交互片段中作為事件是唯一合法的操作集合,換句話說詳細設計必須按這個定義去實現,其他的交互片段都是不合法的。

- strict:多個操作片段必須按照順序發生。下面就是一個典型的例子,切菜和炒菜屬于兩個操作片段(operand) ,這兩個操作片段的順序是必須按順序發生的,是強順序的。

- 狀态恒定(State Invariant)和延續(Continuation):這個的意思就是約束某個對象要在某一個狀态下,舉例如下圖的意思就是說在 start 開始前,Task 必須要在 Finish 狀态。延續也是表達同樣的意思,隻是可以跨多個生命線。

- 無觸發對象消息(Found Message):用活動條開始斷點上的實心球箭頭來表示。用在開始,表示沒有确定的觸發對象。當你隻在意被特定事件觸發或者調用,而不在意調用方是誰的時候,可以用這種表達方式。
- 無接收對象消息(Lost message):用箭頭加實心球表示。用在結束,表示沒有确定的消息接收者。當你核心向表達對外廣播一個消息,而沒有确定的接收消息的對象。就可以用這種表達方式。
- 邊界(Gate):一個時序圖并不一定要求從流程的最開始畫起,也不一定會涉及到流程的終點,因此在這個流程裡,我們不關注的部分稱之為系統邊界(gate),表明消息從外部對象産生,最終返回給外部對象。當時序需要和另外一個外部的時序片段相連的時候,就需要通過邊界。邊界是交互規範的代表。一個時序需要通過一個确定的邊界和另外一個時序連起來。
- 結束(endpoint):流程結束、異常退出的地方用“結束”表示。
編寫時序圖的要點- 在業務設計和系統設計過程中,過程的梳理和設計是關鍵的設計之一,靜态模型需要通過動态模型(時序圖和協作圖)來推演和細化。而且時序要考慮很多複雜的情況,比如并發、比如亂序和異步,所以時序的梳理和設計要力求精細,才能在設計階段發現問題,這也導緻時序圖特别是高級元素的概念比較複雜,但這些對于做出精細化的設計是很有用的。
- 時序圖裡面還有一個高級概念“Interaction Use”在這個裡面沒總結到,“Interaction Use”主要是用于表達通用的、被複用的時序,例如“價格計算”就可以定義成一個獨立的時序,這個時序在下單和詢價過程中都會被用到。這裡沒有整理的原因是在StarUML裡沒試出來該如何表達,并可以靈活跳轉到引用的交互。
- 時序圖除了在詳細設計階段用的上,在業務和概念設計階段其實也是有用的,時序圖是用來表達對象和對象之間交互的時間順序以及行為順序,不限定是針對設計模型、概念、業務模型。比如通過魯棒圖我們定義了參與者、邊界類、控制類、實體類,這些對象直接交互過程也是可以通過時序圖來表達的。
時序圖示例

, 更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!