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