Hello,everybody. 這一期我們來探討一下UML中的協作圖。
協作圖(Collaboration Diagram,又稱協同圖)也是交互圖的一種,它主要描述用例在實現過程中參與的對象以及對象之間的交互消息。
可以認為協作圖是序列圖的另外一種表示交互的方法,但它不強調時間和序列。
協作圖的主要用途是描述類的一個操作的實現,用于描述對象之間的簡單交互。
協作圖主要由對象(Object)、消息(Message)和鏈(Link)三個元素構成。
協作圖中的對象與序列圖中的對象概念相同,也是類的一個實例,其應該是類圖中某個類的實例。
對象的表示法也與序列圖中相同,其命名方式也相同:
即:“對象名:所屬類名”、“對象名”或“:所屬類名”三種,同時也在名稱下畫一條橫線,以表示其是類的一個實例。
也可以使用下面的形式來表示類的多個實例:
協作圖中的消息與序列圖中的消息概念相同,都是從一個對象(發送者)向另外一個對象或幾個其它對象(接收者)發送信號,或由一個對象(發送者或調用者)調用另外一個對象(接收者)的操作。
協作圖中的消息也是由三個基本部分構成:發送者、接收者和消息名稱。
消息也是由帶消息名稱標簽的箭頭表示。它附著在對象之間的鏈上。箭頭方向指向消息的接收者。
一個消息也可以發送給對象自己,即消息的發送者和接收者都是對象自己。
每個消息都有一個序號,用以表明消息的發送順序。消息也有自己的名稱,即操作的名稱,也可以附帶參數,即操作的參數。
下圖中的“1:getRecords(reader)”及箭頭即表示一個消息。它表示對象borrowForm要調用borrowRecords對象的一個操作。
鏈是對象之間的連接,也是類關聯的一個實例。在協作圖中,鏈使用實線或弧來連接兩個對象。
鏈也可以位于一個對象跟自己的連接,鏈的起點和終點在一個對象上。
如下圖就是鏈位于單個對象上的情形。
(1)設置交互的語境;
(2)設置交互的場景;
(3)對每個對象設置初始特性;
(4)描述對象之間可能有信息沿著它傳遞的鏈;
(5)設置消息的順序號。
(1)確定用例中的交互過程——要描述哪個交互;
(2)識別參與交互過程的對象——有哪些對象參與到交互中來;
(3)如果需要,為每個對象設置初始特性——這些初始值對對象間的交互是否有影響,有的話可以添加,否則所有對象都有類似的行為;
(4)確定對象之間的鏈, 及沿著鏈的消息——對象之間有消息傳送,就可以確定一個鏈;
(5)從引發該交互過程的初始消息開始,將每個消息附到相應的鏈;
(6)可以使用特別技巧設置消息的循環發送、時間約束等;
(7)如果需要,可以為每個消息設置前置條件和后置條件。
仍以圖書館借閱系統為例說明協作圖的創作過程。
(1)確定一個交互
讀者還書時,圖書館工作人員使用歸還圖書幫助讀者完成還書的交互過程。
(2)確定參與的對象
圖書館工作人員、還書界面、借閱記錄、業務邏輯處理和數據庫。
(3)繪制對象
在Rose中,“Logical View”(邏輯視圖)上右擊,然后選擇“New”(新建),然后再選擇“Collaboration Diagram”(協作圖),如下圖所示:
將新建的協作圖命名為“還書協作圖”。
雙擊“還書協作圖”,則可以打開繪圖界面。
協作圖中工具箱中的內容及含義如下:
創建對象時,可以直接從左側的元素瀏覽器中,把相應的類拖拽到協作圖繪制區中來。
本例中,從左側把圖書館工作人員、還書業務邏輯、還書數據處理邏輯、還書界面、借閱記錄相關類拖拽到繪圖區,形成以下情形:
(4)確定對象之間的鏈
根據還書業務,哪些對象之間有消息發送,則可以繪制對象之間的鏈。
繪制鏈的方法是,在工具箱中選擇“對象鏈”,鼠標會變為一個向上的箭頭,如下圖所示:
將鼠標移動到其中一個對象上,按下鼠標并滑動到另外一個對象上后,松開鼠標,則創建完兩個對象之間的鏈了。
如果想刪除一個鏈,可以選中鏈之后,按下“CTRL+D”組合鍵,或者在鏈上右擊,然后選擇“Edit”(編輯),再選擇“Delete From Model”(從模型中刪除),則可以徹底刪除該鏈。
本例中最終形成以下效果:
(5)為鏈添加消息
選擇工具箱中的“鏈消息”或“鏈的反向消息”工具為鏈添加消息。
當選擇一種消息后,鼠標會變為黑色十字圖標,在要添加消息的鏈上點擊后,則完成添加消息,如下圖所示:
點擊后的消息暫無名稱,只有序號,如下圖所示:
我們可以通過雙擊消息箭頭來為消息命名或通過兩次點擊(注意不是雙擊)序號來直接輸入消息的名稱。
下圖是通過雙擊箭頭來命名的圖示:
點擊“Apply”(應用)按鈕,則可以在鏈上顯示消息名稱。
同時,在“Detail”選項卡中指定消息的類型和頻次。如下圖:
界面中,上部分指定消息的“同時性”特征,從上到下分別為:簡單消息、同步消息、阻斷消息、超時消息、過程調用、異步消息和返回消息。
其中阻斷消息和超時消息是Rose添加的兩種消息。
阻斷消息是指消息發送者只有在消息接收者能接受消息時發送消息,否則消息發送者將放棄該消息。
超時消息是指發送消息的對象在發送消息時指定等待時間,如果消息接收者未能在指定時間內處理完該消息,則消息發送者將放棄該消息。
過程調用是指對象發出消息后,等待處理消息的整個過程完畢后才繼續工作。
消息的頻次可以設置消息按規定的時間間隔發送。
其中,Aperiodic是指不定期發送的消息,Periodic是指定消息為定期發送。
我們也可以雙擊鏈或右擊鏈后選擇“Open Specification...”來為鏈添加消息。
這兩種操作都會打開一個下圖所示的對話框。
在該對話框的“General”選項卡中可以設置鏈的名稱,關聯的名稱,以及作為提供者類和客戶類的可見性。
“Messages”選項卡中的內容如下:
在這里,可以修改鏈上已有消息的內容或添加新消息。
在已有消息中雙擊后彈出的對話框與雙擊消息箭頭時彈出的對話框相同,可以進一步指定消息的名稱、消息的類型等內容。
在上圖空白處右擊,可以選擇“Insert To”命令為鏈的某一端對象添加操作(消息提供者)。如下圖所示:
在插入新建消息時,要指明消息的提供者(操作的提供者)。
也可以在已有的消息上右擊選擇“<new operation>”,為鏈添加方向一致的消息。如下圖所示:
(6)調整對象布局
設置完對象的消息后,通過調整對象的布局,消息的排列,使圖閱讀更加容易。
本例的最終效果如下圖所示:
在Rose中,序列圖和協作圖可以相互轉換。
由序列圖生成協作圖的具體操作方法為:
(1)打開已經創建好的序列圖;
(2)選擇“Browse”菜單下的“Create Collaboration Diagram”或按下F5快捷鍵,則完成了由序列圖生成協作圖的操作。
(3)優化排列 雖然生成了協作圖,但排列還比較混亂,需要通過調整對象的位置和對象間的距離來完整顯示相關內容。
下圖是由上篇文章中繪制的序列圖生成的協作圖。
以上是關于協作圖的有關內容,如有問題請留言。
新聞熱點
疑難解答