解析常用UML圖中用例圖,類圖,序列圖
本文和大家重點討論一下常用UML圖,最常用的UML圖包括:用例圖、類圖、序列圖、狀態圖、活動圖、組件圖和部署圖,這里向大家介紹一下用例圖,類圖和序列圖。
常用UML圖
1.用例圖
用例圖描述了系統提供的一個功能單元。常用UML圖中用例圖的主要目的是幫助開發團隊以一種可視化的方式理解系統的功能需求,包括基于基本流程的"角色"(actors,也就是與系統交互的其他實體)關系,以及系統內用例之間的關系。用例圖一般表示出用例的組織關系--要么是整個系統的全部用例,要么是完成具有功能(例如,所有安全管理相關的用例)的一組用例。要在用例圖上顯示某個用例,可繪制一個橢圓,然后將用例的名稱放在橢圓的中心或橢圓下面的中間位置。要在用例圖上繪制一個角色(表示一個系統用戶),可繪制一個人形符號。角色和用例之間的關系使用簡單的線段來描述,如圖1所示。
圖1:示例用例圖
圖字(從上到下):CD銷售系統;查看樂隊CD的銷售統計;樂隊經理;查看Billboard200排行榜報告;唱片經理;查看特定CD的銷售統計;檢索最新的Billboard200排行榜報告;排行榜報告服務
用例圖通常用于表達系統或者系統范疇的高級功能。如圖1所示,可以很容易看出該系統所提供的功能。這個系統允許樂隊經理查看樂隊CD的銷售統計報告以及Billboard200排行榜報告。它也允許唱片經理查看特定CD的銷售統計報告和這些CD在Billboard200排行榜的報告。這個圖還告訴我們,系統將通過一個名為"排行榜報告服務"的外部系統提供Billboard排行榜報告。
此外,在用例圖中,沒有列出的用例表明了該系統不能完成的功能。例如,它不能提供給樂隊經理收聽Billboard200上不同專輯中的歌曲的途徑--也就是說,系統沒有引用一個叫做"收聽Billboard200上的歌曲"的用例。這種缺少不是一件小事。在用例圖中提供清楚的、簡要的用例描述,項目贊助商就很容易看出系統是否提供了必須的功能。
2.類圖
類圖表示不同的實體(人、事物和數據)如何彼此相關;換句話說,它顯示了系統的靜態結構。常用UML圖中類圖可用于表示邏輯類,邏輯類通常就是業務人員所談及的事物種類--搖滾樂隊、CD、廣播??;或者貸款、住房抵押、汽車信貸以及利率。類圖還可用于表示實現類,實現類就是程序員處理的實體。實現類圖或許會與邏輯類圖顯示一些相同的類。然而,實現類圖不會使用相同的屬性來描述,因為它很可能具有對諸如Vector和HashMap這種事物的引用。
類在類圖上使用包含三個部分的矩形來描述,如圖2所示。最上面的部分顯示類的名稱,中間部分包含類的屬性,最下面的部分包含類的操作(或者說"方法")。
根據我的經驗,幾乎每個開發人員都知道這個類圖是什么,但是我發現大多數程序員都不能正確地描述類的關系。對于像圖3這樣的類圖,您應該使用帶有頂點指向父類的箭頭的線段來繪制繼承關系1,并且箭頭應該是一個完全的三角形。如果兩個類都彼此知道對方,則應該使用實線來表示關聯關系;如果只有其中一個類知道該關聯關系,則使用開箭頭表示。
圖3:一個完整的類圖,包括了圖2所示的類對象
在圖3中,我們同時看到了繼承關系和兩個關聯關系。CDSalesReport類繼承自Report類。一個CDSalesReport類與一個CD類關聯,但是CD類并不知道關于CDSalesReport類的任何信息。CD類和Band類都彼此知道對方,兩個類彼此都可以與一個或者多個對方類相關聯。
3.序列圖
常用UML圖中序列圖顯示具體用例(或者是用例的一部分)的詳細流程。它幾乎是自描述的,并且顯示了流程中中不同對象之間的調用關系,同時還可以很詳細地顯示對不同對象的不同調用。
序列圖有兩個維度:垂直維度以發生的時間順序顯示消息/調用的序列;水平維度顯示消息被發送到的對象實例。
序列圖的繪制非常簡單。橫跨圖的頂部,每個框(參見圖4)表示每個類的實例(對象)。在框中,類實例名稱和類名稱之間用空格/冒號/空格來分隔,例如,myReportGenerator:ReportGenerator。如果某個類實例向另一個類實例發送一條消息,則繪制一條具有指向接收類實例的開箭頭的連線,并把消息/方法的名稱放在連線上面。對于某些特別重要的消息,您可以繪制一條具有指向發起類實例的開箭頭的虛線,將返回值標注在虛線上。就我而言,我總喜歡繪制出包括返回值的虛線,這些額外的信息可以使得序列圖更易于閱讀。
閱讀序列圖也非常簡單。從左上角啟動序列的"驅動"類實例開始,然后順著每條消息往下閱讀。記?。弘m然圖4所示的例子序列圖顯示了每條被發送消息的返回消息,但這只是可選的。
圖4:一個示例序列圖
通過閱讀圖4中的示例序列圖,您可以明白如何創建一個CD銷售報告(CDSalesReport)。其中的aServlet對象表示驅動類實例。aServlet向名為gen的ReportGenerator類實例發送一條消息。該消息被標為generateCDSalesReport,表示ReportGenerator對象實現了這個消息處理程序。進一步理解可發現,generateCDSalesReport消息標簽在括號中包括了一個cdId,表明aServlet隨該消息傳遞一個名為cdId的參數。當gen實例接收到一條generateCDSalesReport消息時,它會接著調用CDSalesReport類,并返回一個aCDReport的實例。然后gen實例對返回的aCDReport實例進行調用,在每次消息調用時向它傳遞參數。在該序列的結尾,gen實例向它的調用者aServlet返回一個aCDReport。
請注意:圖4中的序列圖相對于典型的序列圖來說太詳細了。然而,我認為它才是足夠易于理解的,并且它顯示了如何表示嵌套的調用。對于初級開發人員來說,有時把一個序列分解到這種詳細程度是很有必要的,這有助于他們理解相關的內容。
【編輯推薦】