序列圖(Sequence Diagram),又稱順序圖或時序圖,它是描述對象行為的一種交互視圖。
序列圖描述某個業務場景的行為,它關注對象之間消息傳送的時間順序。
如在圖書館借閱系統中,圖書館工作人員幫助讀者完成圖書借閱的業務場景、幫助讀者完成還書的業務場景、讀者在線預借圖書的場景等。
序列圖的主要用途是為用例進行邏輯建模,對用例所表達的需求進行更加精細的表達。
序列圖主要包括對象、生命線、消息和激活4種元素。
在UML中,序列圖將交互關系表示為一張二維圖。其中,縱向為時間軸,時間沿豎線向下延伸。橫向是對象維,在這一維度上水平排列著參與交互的各個對象。
對象是類的一個實例或一組實例。UML中對象的圖形有下面三種情形:
(1)對象名+對象所屬的類名
(2)只有對象名(省略類名)
(3)只有類的名稱(匿名對象)
三種對象的表示方法如下圖所示:
不管使用哪種形式的對象,其名稱下面都有一條下劃線,以表明其是對象元素。
生命線代表了一次交互中的一個參與對象在一段時間內的存在。
在序列圖中,生命線位于每個對象的底部中心位置,顯示為一條垂直的虛線,與時間軸平行。
消息是從一個對象(發送者)向另一個對象(接收者)發送信號,或由一個對象(發送者或調用者)調用另一個對象(接收者)的操作。
在序列圖中,消息表示為從一個對象的生命線指向另一個對象的生命線的箭頭。
消息的類型主要包括簡單消息、同步消息、異步消息、返回消息四種。另外,還有一種消息是對象向自己發送消息的自反消息。
(1)簡單消息
簡單消息可以泛指對象之間的任何消息調用或發送,而不必關心是異步還是同步的。
(2)同步消息
對象發送消息后,需要接收消息的對象響應完畢并返回消息時才會進行其余的工作。
(3)異步消息
對象發送消息后,不需要等待接收對象的返回消息可以繼續執行其余的工作。
(4)自反消息
也是簡單消息的一種,不過是對象向自己發送消息,而不是其它的對象。
激活表示一個對象執行一個動作所經歷的時間段。
一般情況下,當一個對象收到其它對象發送的消息時被激活,在激活期內處理該消息,激活結束時應該發出一個消息。
在UML中使用處于生命線上的垂直長條矩形來表示。矩形的開始處為對象開始操作動作,底部表示操作動作的結束。
刪除標志使用一個“×”來表示。其位于對象生命線的低端,表示刪除對象。
建模順序:
(1)設置交互的語境:哪個系統?哪些類?哪個用例?用例的哪些腳本?
(2)設置交互場景:識別對象在交互中扮演的角色。
(3)為對象設置生命線:很多建模工具在對序列圖建模時,對象自帶生命線。
(4)設置消息,從引發交互的消息開始,按時間順序考慮對象之間產生的消息,及消息的特征(參數、返回值類型等)。
(5)設置激活期,Rose工具在建模時,當繪制消息時,自動創建激活,根據需要可以改變激活期的大小,有些工具需要設計人員專門拖拽一個激活期到對象的生命線上。
(6)設置其它約束及條件。如時間的約束、循環的約束,消息的條件等。
S校圖書館借閱系統中,圖書管理員處理借閱信息,即用例圖中的借閱圖書。
(1)確定主流程
讀者把要借閱的書籍送到借閱臺;
圖書館工作人員在登錄系統后進入圖書借閱界面;
讀者刷取借閱證;
系統獲取讀者信息和已借閱的圖書信息列表;
在沒有欠款、沒有超期圖書,且已借閱數量未達到限制時,圖書館工作人員使用掃描槍掃描每本待借書籍;
系統通過業務邏輯層獲取圖書的信息,并添加到借閱列表中;
圖書館工作人員保存借閱信息,完成借閱。
(2)確定序列圖中參與交互的對象
主要包括:圖書館工作人員、借閱界面、借閱列表、業務邏輯層、數據庫等
(3)繪制序列圖
這里只包含基本流程:獲取讀者信息->掃描圖書->保存借閱->結束借閱。
而對于驗證讀者可借閱冊數、是否有超期或是否有欠款信息等可以在額外的序列圖中繪制。以免使得序列圖變得過于龐大。
(4)注意事項
如在建模過程中,用例或業務比較復雜,可以將用例流程拆解為基本流程和若干備選流程,在繪制備選流程中只繪制與主流程不同的地方即可。
如在借閱圖書這個用例中,有超期信息及有罰款信息時不能進行借閱,這時可以分別單獨繪制序列圖。而有罰款信息時,如讀者選擇圖書館工作人員處理罰款信息,則在序列圖中只繪制相關消息,具體的罰款處理可以參考罰款處理的序列圖。
序列圖可以在分析中獲取用戶操作的大致過程,這時的序列圖可以粗一些,完全可以把系統看成黑盒對象,在設計中可以進一步的細化,使設計人員更能清楚各個類對象之間如何實現交互。
在UML2.x中,提供了更加豐富的功能來描述現實中的建模要求,在序列圖部分也添加了不少元素,如片段,這樣可以幫助建模人員方便的描述循環消息、條件消息、并行消息等。當然UML2.x使建模本身也變得極其復雜。
那么在UML1.x中如何恰當的表示這些信息呢?
有可能對象的某個操作需要循環調用消息,這時可以借助下面的方法:
*[for all borrowing books]:scanBooks()
這里表示圖書館工作人員需要對每本待借書籍執行掃描操作,需要多次調用借閱界面的scanBooks()操作。
上面這種適用于調用數量不確定的情形,對于確定調用次數的情形可以使用下面的方法:
*[i:=1..n]: connectServer(connInfo)
這里表示connectServer()消息最多執行n次。
一種方法是可以在條件前加上警戒條件,如:
[borrowNum<=20]:getBookInfo(barCode)
這里表示當借閱圖書數量未超過20時,借閱界面才會向業務邏輯層請求獲取圖書信息。
也可以在序列圖中使用下面的方法來表示:
有時,我們可能需要表示發送消息和返回消息之間的間隔要小于指定時間,這時也可以在序列圖中使用某種特殊方法來表示。
以上內容介紹了UML中序列圖的概念、構成元素以及繪制序列圖的步驟,并給出了一個樣例。希望你讀完這篇文章對你的知識海洋有所補充。
新聞熱點
疑難解答