java基礎學習(三):UML統一建模語言

3.1 UML(統一建模語言)介紹

  面向對象軟件開發需要經過OOA(面向對象分析)、OOD(面向對象設計)和OOP(面向對象編程)三個階段。OOA對目標系統進行分析,建立模型,並將之文檔化;OOD用面向對象的思想對OOA的結果進行細化,得出設計模型。OOA和OOD的分析、設計結果需要統一的符號來描述、交流並記錄,UML就是這種用於描述、記錄OOA和OOD結果的符號表示法。

在這裏插入圖片描述
  如圖,UML2.0一共包括13種正式圖形:活動圖(activity diagram)、類圖(calss diagram)、通信圖(communication diagram)、組件圖(component diagram)、複合結構圖(composite structure diagram)、部署圖(deployment diagram)、交互概觀圖(interactive overview diagram)、對象圖(object diagram)、包圖(package diagram)、順序圖(sequence diagram)、狀態機圖(state machine diagram)、定時圖(timing diagram)、用例圖(use case diagram)。

  真的太多了,誰設計的,頭皮發麻。其實很少有一個軟件系統在分析、設計階段對每個細節都使用13種圖形來表現。記住一點:不要把UML表示法當成是一種負擔,而應該把它當成一種工具,一種用於描述、記錄軟件分析設計的工具。最常用的UML圖包括例圖、類圖、組件圖、部署圖、順序圖、活動圖和狀態機圖等。

3.1.1 用例圖

  用例圖用於描述系統提供的系列功能,而每個用例則代表系統的一個功能模塊。用例圖的主要目的是幫助開發團隊以一種可視化的方式理解系統的需求功能,用例圖對系統的實現不做任何說明,僅僅是系統功能的描述。
  用例圖包括用例(以一個橢圓表示,用例的名稱放在橢圓的中心或橢圓下面)、角色(Actor,也就是與系統交互的其他實體,以一個人形符號表示)、角色和用例之間的關係(以簡單的線段來表示),以及系統內用力之間的關係。用例圖一般表示出用例的組織關係——要麼是整個系統的全部用例,要麼是完成具體功能的一組用例。
在這裏插入圖片描述
  用例圖通常用於表達系統或者系統範疇的高級功能。如圖所示,很容易看出該系統所提供的功能。這個系統允許註冊用戶登錄、發帖和回覆,其中發帖和回覆需要依賴於登錄;允許管理員刪除其他人的帖子,刪帖也依賴於登錄。
  用例圖主要在需求分析階段使用,主要用於描述系統實現的功能,方便與客戶交流,保證系統需求的無 性,用實例圖表示系統外觀,不要指望用例圖和系統的各個類之間有任何聯繫 不要把用例做得過多,過多的用例將導致難以閱讀,難以理解:儘可能多地使用文字說明。

3.1.2 類圖

  類圖是最古老、功能最豐富、使用最廣泛的UML圖。類圖表示系統中應該包含哪些實體,各實體之間如何關聯;換句話說,它顯示了系統的靜態結構,類圖可用於表示邏輯類,邏輯類通常就是業務人員所談的食物種類。
  類在類圖上使用包含三個部分的矩形來描述,最上面的部分顯示類的名稱,中間部分包含類的屬性,最下面的部分包含類的方法。

在這裏插入圖片描述
  特別好理解這個,類圖除可以表示實體的靜態內部結構之外,還可以表示實體之間的相互關係。類之間有三種基本關係:

  • 關聯(包括聚合、組合)
  • 泛化(與繼承同一個概念)
  • 依賴

1. 關聯

  客觀世界中兩個實體之間總是存在一定的關係。當兩個實體抽象到軟件系統中時,兩個類之間必然存在關聯,關聯具有一定的方向性。如果僅能從一個類單方向地訪問另一個類,則被稱爲單向關聯,;如果兩個類可以互相訪問對象,則被稱爲雙向關聯。一個對象能訪問關聯對象的數目被稱爲多重性,例如,建立學生和老師之間的單向關聯,則可以從學生訪問老師,但從老師不能訪問學生關聯使用一條實線來表示,帶箭頭的實線表示單向關聯。
  關聯關係包括兩種特例:聚合和組合,它們都有部分和整體的關係,但通常認爲組合比聚合更加嚴格。當某個實體聚合成另一個實體時,該實體還可以同時是另一個實體的部分,例如,學生既可以是籃球俱樂部的成員,也可以是書法俱樂部的成員 當某個實體組合成另 個實體時,該實體則不能同時是一個實體的部分。聚合使用帶空心菱形框的實線表示,組合則使用帶實心菱形框的實線表示。
在這裏插入圖片描述
  如圖,Teacher和Student之間的關聯關係:他們是雙向關係,而且使用了多重性來表示Teacher和Student之間存在1:N的關聯關係(1…*表示可以一個到多個),即一個Teacher實體可以有1個或多個關聯的Student實體;Student和BasketBallClub存在整合關係,即一個或多個Student實體可以聚合成一個BasketBallClub實體;而Arm(手臂)和Student之間存在組合關係,2個Arm實體組合成一個Student實體。

2. 泛化

  泛化與繼承是同一個概念,都是指子類是一種特殊的父類,類與類之間的繼承關係是非常普遍的,繼承關係使用帶空心三角形的實踐表示。
在這裏插入圖片描述
  如圖可以看出,Student是Person的子類,即Student類是一種特殊的Person類。

3. 依賴

  如果一個類的改動會導致另一個類的改動,則稱兩個類之間存在依賴。依賴關係使用帶箭頭的虛線表示,其中箭頭所指向被依賴的實體。依賴的常見可能原因如下:
(1)改動的類將消息發送給另一個類
(2)改動的類以另一個類作爲數據部分
(3)改動的類以另一個類作爲操作參數
  通常而言,依賴是單向的,尤其是當數據表現和數據模型分開設計時,數據表現依賴於數據模型。
在這裏插入圖片描述
  其中當DefaultTableModel發生改變的時候,JTable將相應地發生改變。記住!!!,跟我們理解有點反向,JTable是受改變方。

3.1.3 組件圖

  對於現代的大型應用程序而言,通常不只是單獨一個類或單獨一組類所能完成的,通常會由一個或多個可部署的組件完成。對Java程序而言,可複用的組件通常打包成一個JAR、WAR等文件;對C/C++應用而言,可複用的組件通常是一個函數庫,或者是一個DLL(動態鏈接庫)文件。
  組件圖提供系統的物理視圖,它的用途是顯示系統中的軟件對其他軟件組件(例如,庫函數)的依賴關係。組件圖可以在一個非常高的層次上顯示,僅顯示系統中的粗粒度的軟件,也可以在組件包層次上顯示。
  組件圖通常包含組件、接口和Port等圖元,UML使用帶兩個矩形加一個大矩形的符號表示(如下圖所示),使用圓圈代表接口,使用位於組件邊界上的小矩形代表Port。
  組件的接口表示它能對外提供的服務規範,這個接口通常有兩種表現形式。
(1)用一條實線連接到組件邊界的圓圈表示
(2)使用位於組件內部的圓圈表示
  組件除可以對外提供服務接口之外,組件還可能依賴於某一個接口,組件依賴於某個接口使用一條帶半圓的實線來表示。
在這裏插入圖片描述
  如圖所示,本系統繪製電子購物平臺的幾個核心組件,其中Order組件提供OrderQuery接口,該接口允許Dispatch組件查詢系統中的訂單及其狀態,Order組件又需要依賴於Customer組件的CustomerLookup接口,通過該接口查詢系統中的顧客信息;Order組件也需要依賴於Inventory組件的ProductQuery接口,通過該接口查詢系統中的產品信息。

3.1.4 部署圖

  現代的軟件工程早已超出早期的單機程序,整個軟件可能是跨國家、跨地區的分佈式軟件,軟件的不同部分可能需要部署在不同地方、不同平臺上。部署圖用於描述軟件系統如何部署到硬件環境中,它的用途是顯示軟件系統不同的組件將在何處物理允許,以及它們將如何彼此通信。
  因爲部署圖是對物理運行情況進行建模,所以系統的生產人員就可以很好的利用這種圖來進行安裝、部署軟件系統。
  部署圖中的符號包括組件圖中所使用的符號元 ,另外還增加了節點的概念:節點是各種計算資源的通用名稱,主要包括處理器和設備兩種類型,兩者的區別是處理器能夠執行程序的硬件構件(如計算機主機) ,而設備是 種不具備計算能力的硬件構件(如打印機 UML 中使用 維立方體來表示節點,節點的名稱位於立方體的頂部 17 顯示了 個簡單的部署圖。
在這裏插入圖片描述
  整個應用分爲5個組件:Student、Administrator、應用持久層、Student數據庫和UI界面組件,部署圖準確地表現了各組件之間地依賴關係。其中普通客戶端無須部署任何組件,直接使用客戶端瀏覽器即可 管理者客戶機上需要部署 UI 界面 應用服務器上需要部署 Student Administrator應用持久層 個組件:而數據庫服務器上需要部署 Student 數據庫。

3.1.5 順序圖

  順序圖顯示具體應用(或者是用例地一部分)的詳細流程,並且顯示流程中不同對象之間的調用關係,同時還可以很詳細地顯示對不同對象地不同調用。順序圖描述了對象之間的交互(順序圖和通信圖都被稱爲交互圖),重點在於描述消息及時間順序。
  順序圖有兩個維度:垂直維度,以發生的時間順序顯 消息 調用的序列;水平維度,顯示消息被髮送到的對象實例 順序圖的關鍵在於對象之間的消息,對象之間的信息傳遞就是所謂的消息發送,消息通常表現爲對象調用另 個對象的方法或方法的返回值,發送者和接收者之間的箭頭表示消息。
  順序圖的繪製非常簡單 順序圖的頂部每個框表示每個類的實例(對象) 框中的類實例名稱和類名稱之間用冒號或空格來分隔 ,例如myReportGenerator : ReportGenerator 如果某個類實例向另 個類實例發送一條消息,則繪製 條指向接收類實例的帶箭頭的連線 ,並把消息/方法的名稱放在連線上面。
  對於某些特別重要的消息,還可以繪製 條帶箭頭的指向發起類實例的虛線上, 將返回值標註在虛線繪製帶返回值的信息可以使得序列圖更易於閱讀。
在這裏插入圖片描述
  當繪製順序圖時,消息可以向兩個方向擴展,消息穿梭在順序圖中,通常應該把消息發送者與接收者相鄰擺放,儘量避免消息跨越多個對象。對象的激活期不是其存在的時間,而是它佔據 PU 的執行時間,繪製順序圖時,激活期要精確。
  閱讀順序圖也非常簡單,通常從最上面的消息開始(也就是時間上最先開始的消息) ,然後沿消息方向依次閱讀。

PS:與順序圖相似的還有通信圖,一般來說,通信圖可以描述的內容,順序圖都可以描述,但是順序圖比通信圖多了時間觀念。

3.1.6 活動圖

活動圖和狀態機圖都被稱爲演化圖,其區別和聯繫如下:

  • 活動圖:用於描述用例內部的活動或方法的流程,如果除去活動圖中的並行活動描述,它就變成流程圖。
  • 狀態機圖:描述某一對象生命週期中需要關注的不同狀態,並會詳細描述刺激對象狀態改變的事件,以及對象狀態改變時所採取的動作。

演化圖的5要素如下:

  • 狀態 :狀態是對象響應事件前後的不同面貌,狀態是某個時間段對象所保持的穩定態,目前的軟件計算都是基於穩定態的,對象的穩定態是對象的固有特徵, 個對象的狀態 般是有限的有限狀態的對象是容易計算的,對象的狀態越多,對象的狀態遷移越複雜,對象狀態可以想象成對象演化過程中的快照。
  • 事件 :來自對象外界的剌激,通常的形式是消息的傳遞,只是相對對象而言發生了事件。事件是對象狀態發生改變的原動力。
  • 動作:動作是對象針對所發生事件所做的處理,實際上通常表現爲某個方法被執行。
  • 活動:活動是動作激發的後續系統行爲
  • 條件:條件指事件發生所需要具備的條件

對於激發對象狀態改變的事件,通常有如下兩種類型:

  • 內部事件:從系統內部激發的事件,一個對象的方法( 動作)調用(通過事件激活)另 個對象的方法(動作)
  • 外部事件 從系統邊界外激發的事件,例如用戶的鼠標、鍵盤動作。

  活動圖主要用於描述過程原理、業務邏輯以及工作流技術 活動圖非常類似於傳統的流程圖 它也使用圓角矩形表示活動 ,使用帶箭頭的實線表示事件:區別是活動圖支持併發。
在這裏插入圖片描述
  如圖,如果將這個活動圖的兩支分開,每支就是 個傳統的流程圖,每個活動依次向下 ,遇到條件分支使用菱形框來表示條件 ,與傳統的流程圖不同的是 ,活動圖可 以使用並行分支分出多條並行活動。
  繪製活動圖時以活動爲中心, 整個活動圖只有 個開始活動,可以有多個結束活動.活動圖需要將並行活動和串行活動分離,遇到分支和循環時最好像傳統的流程圖那樣將分支、循環條件明確表示動圖最大優點在於支持並行行爲,並行對於工作流建模和過程建模非常重要 所以有了並行 因此需要進行同步,同步通過匯合來指明。

3.1.7 狀態機圖

  狀態機圖表示某個對象所處的不同狀態和該類的狀態轉換信息。 實際上, 通常只對"感興趣的"對象繪製狀態機圖。 就是說, 在系統活動期間具有 三個或更多潛在狀態的對象才需要考慮使用狀態機圖進行描述。
狀態機圖的符號集包括5個基本元素:

  • 初始狀態,使用實心圓來繪製
  • 狀態之間的轉換,使用具有帶箭頭的線段來繪製
  • 狀態,使用圓角矩形來繪製
  • 判斷點,使用空心圓來繪製
  • 一個或多個終止點,使用內部包含實心圓的圓來繪製。
     要繪製狀態機圖, 先繪製起點和一條指向該類的初始狀態的轉換錢段。狀態本身可以在圖中的任意位置繪製,然後使用狀態轉換線段將它們連接起來。
    在這裏插入圖片描述
      描繪了Hibemate 實體三個狀態:瞬態、持久化和脫管。當程序通過 new 直接創建一個對象時,該對象處於瞬態;對 個瞬態的對象執行 save()、saveOrUpdate()方法後該對象將會變成持久化狀態:對一個持久化狀態的實體執行 delete()方法後該對象將變成瞬態:持久化狀態和脫管狀態也可以相互轉換。
      繪製狀態機圖時應該保證對象只有一個初始狀態,可以有多個終結狀態,狀態要表示對象的關鍵快照,有重要的實際意義,無關緊要的狀態則無須考慮,繪製狀態機圖時事件和方法要明確。
      狀態機圖擅長表現單個對象的跨用例行爲,對於多個對象的交互行爲應該考慮採用順序圖,不要對系統的每個對象都畫狀態機圖,只對真正需要關心各個狀態的對象才繪製狀態機圖。

  終於結束了,實話說,這一部分的內容太太太枯燥難懂了。下面就來做一個總結吧:

  1. 用例圖:主要在需求分析階段使用,說白就是你給產品經理進行講解你要做的一些功能什麼的,在前期比較適用。
  2. 類圖:是最古老、功能最豐富、使用最廣泛的UML圖。這個圖感覺在java內部人士用得最多,因爲可以很簡單容易得表達出你所建的類,類與類之間的關係,以及每個類下面的方法等。
  3. 組件圖:對於現代的大型應用程序而言,通常只是單獨一個類或單獨一組類所能完成的。一般用於大型軟件,較爲複雜涉及到衆多類的時候,使用該圖。
  4. 部署圖:用於描述軟件系統如何部署到硬件環境中,其實就是將這個交給相關部署人員,部署人員通過該圖可以清楚的瞭解到那部分需要相關的硬件部署。
  5. 順序圖:描述了對象之間的交互(順序圖和通信圖都被稱爲交互圖),重點在於描述消息及時間順序。這個的話主要是體現出一個程序在時間內的流程(注重時間
  6. 活動圖:多併發的流程圖!,主要是多條流程圖分支構成
  7. 狀態機圖:在擁有多個狀態三個或更多,使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章