厲害了,一文帶你掌握 14 種 UML 圖!

Java技術棧

www.javastack.cn

關注閱讀更多優質文章

什麼是UML?

UMLUnified Model Language的縮寫,中文是統一建模語言,是由一整套圖表組成的標準化建模語言。

爲什麼要用UML?

通過使用UML使得在軟件開發之前, 對整個軟件設計有更好的可讀性,可理解性,從而降低開發風險。同時,也能方便各個開發人員之間的交流。

UML提供了極富表達能力的建模語言,可以讓軟件開發過程中的不同人員分別得到自己感興趣的信息。

Page-Jones 在《Fundamental Object-Oriented Design in UML》 一書中總結了UML的主要目的,如下:

  1. 爲用戶提供現成的、有表現力的可視化建模語言,以便他們開發和交換有意義的模型。

  2. 爲核心概念提供可擴展性 (Extensibility) 和特殊化 (Specialization) 機制。

  3. 獨立於特定的編程語言和開發過程。

  4. 爲了解建模語言提供一個正式的基礎。

  5. 鼓勵面向對象工具市場的發展。

  6. 支持更高層次的開發概念,如協作,框架,模式和組件。

  7. 整合最佳的工作方法 (Best Practices)。

UML圖有哪些?

  • UML圖分爲結構圖和行爲圖。

  • 結構圖分爲類圖、輪廓圖、組件圖、組合結構圖、對象圖、部署圖、包圖。

  • 行爲圖又分活動圖、用例圖、狀態機圖和交互圖。

  • 交互圖又分爲序列圖、時序圖、通訊圖、交互概覽圖。

UML圖概覽

什麼是類圖?

  • 【概念】 類圖是一切面向對象方法的核心建模工具。類圖描述了系統中對象的類型以及它們之間存在的各種靜態關係。

  • 【目的】用來表示類、接口以及它們之間的靜態結構和關係。

在類圖中,常見的有以下幾種關係。

泛化(Generalization)

  • 【泛化關係】是一種繼承關係,表示子類繼承父類的所有特徵和行爲。

  • 【箭頭指向】帶三角箭頭的實線,箭頭指向父類。

實現(Realization)

  • 【實現關係】是一種類與接口的關係,表示類是接口所有特徵和行爲的實現。

  • 【箭頭指向】帶三角箭頭的虛線,箭頭指向接口。

關聯(Association)

  • 【關聯關係】是一種擁有關係,它使得一個類知道另一個類的屬性和方法。

  • 【代碼體現】成員變量

  • 【箭頭指向】帶普通箭頭的實線,指向被擁有者。雙向的關聯可以有兩個箭頭,或者沒有箭頭。單向的關聯有一個箭頭。

自己買的車,想什麼時候開就開。但是車是車,人是人,沒有整體與部分的關係。

聚合(Aggregation)

  • 【聚合關係】是一種整體與部分的關係。且部分可以離開整體而單獨存在。聚合關係是關聯關係的一種,是強的關聯關係;關聯和聚合在語法上無法區分,必須考察具體的邏輯關係。

  • 【代碼體現】成員變量

  • 【箭頭指向】帶空心菱形的實線,空心菱形指向整體。

電腦有鍵盤才能輸入信息,電腦是整體,鍵盤是部分,鍵盤也可以離開電腦,單純的拿去敲。所以是聚合。

組合(Composition)

  • 【組合關係】是一種整體與部分的關係。但部分不能離開整體而單獨存在,組合關係是關聯關係的一種,是比聚合關係還要強的關係。

  • 【代碼體現】成員變量

  • 【箭頭指向】帶實心菱形的實線,實心菱形指向整體。

鳥是整體,翅膀是部分。鳥死了,翅膀也就不能飛了。所以是組合。我們再看一下,下面的一組經典的聚合組合關係的例子。

一個公司擁有多個部門,公司和部門之間是組合關係,公司破產了,部門就不復存在了。部門和員工是聚合關係,部門被裁掉,員工就換下家了。

依賴(Dependency)

  • 【依賴關係】是一種使用關係,即一個類的實現需要另一個類的協助。

  • 【箭頭指向】帶普通箭頭的虛線,普通箭頭指向被使用者。

老司機只管開車,車是誰的不重要,給什麼車開什麼車。

什麼是組件圖?

  • 【概念】描繪了系統中組件提供的、需要的接口、端口等,以及它們之間的關係。

  • 【目的】用來展示各個組件之間的依賴關係。

訂單系統組件依賴於客戶資源庫和庫存系統組件。中間的虛線箭頭表示依賴關係。另外兩個符號,表示組件連接器,一個提供接口,一個需要接口。

什麼是部署圖?

  • 【概念】描述了系統內部的軟件如何分佈在不同的節點上。

  • 【目的】用來表示軟件和硬件的映射關係。

圖中簡單的表示,不同機器上面部署的不同軟件。

什麼是對象圖?

  • 【概念】對象圖是類圖的一個實例,是系統在某個時間點的詳細狀態的快照。

  • 【目的】用來表示兩個或者多個對象之間在某一時刻之間的關係。

圖中就是描述的,某時間點bat這個公司有一個研發部,一個銷售部,兩個部門只有一個人iisheng

什麼是包圖?

  • 【概念】描繪了系統在包層面上的結構設計。

  • 【目的】用來表示包和包之間的依賴關係。

  • 《Use》關係表示使用依賴,Web Shopping依賴Payment

  • 《Merge》關係表示合併,Web Shopping合併了Shopping Cart就擁有了Shopping Cart的功能

  • 《Access》關係表示私有引入,比如代碼中的指定包名類名

  • 《Import》關係表示公共引入,比如Java中的import之後,就可以直接使用import包中的類了。

什麼是組合結構圖?

  • 【概念】描述了一個"組合結構"的內部結構,以及他們之間的關係。這個"組合結構"可以是系統的一部分,或者一個整體。

  • 【目的】用來表示系統中邏輯上的"組合結構"。

圖中描述了Car是由車軸連接着的兩個前面輪子、兩個後面輪子,和引擎組合的。

什麼是輪廓圖?

  • 【概念】輪廓圖提供了一種通用的擴展機制,用於爲特定域和平臺定製UML模型。

  • 【目的】用於在特定領域中構建UML模型。

圖中我們定義了一個簡易的EJB的概要圖。Bean是從Component擴展來的。Entity BeanSession Bean繼承了BeanEJB擁有RemoteHome接口,和JAR包。

什麼是用例圖?

  • 【概念】用例圖是指由參與者、用例,邊界以及它們之間的關係構成的用於描述系統功能的視圖。

  • 【目的】用來描述整個系統的功能。

用例圖中包含以下三種關係:

  • 包含關係使用符號《include》,想要查看訂單列表,前提是需要先登錄。

  • 擴展關係使用符號《extend》,基於查詢訂單列表的功能,可以增加一個導出數據的功能

  • 泛化關係,子用例繼承父用例所有結構、行爲和關係。

什麼是活動圖?

  • 【概念】描述了具體業務用例的實現流程。

  • 【目的】用來表示用例實現的工作流程。

圖中簡單描述了,從開始到登錄到查看訂單列表,或者登錄失敗直接結束。

什麼是狀態機圖?

  • 【概念】狀態機圖對一個單獨對象的行爲建模,指明對象在它的整個生命週期裏,響應不同事件時,執行相關事件的順序。

  • 【目的】用來表示指定對象,在整個生命週期,響應不同事件的不同狀態。

圖中描述了,門在其生命週期內所經歷的狀態。

什麼是序列圖?

  • 【概念】序列圖根據時間序列展示對象如何進行協作。它展示了在用例的特定場景中,對象如何與其他對象交互。

  • 【目的】通過描述對象之間發送消息的時間順序顯示多個對象之間的動態協作。

圖中展示的是支付寶條碼支付場景的序列圖。其中,loop是循環,alt是選擇,序列圖的其他關係這裏就不介紹了。

什麼是通訊圖?

  • 【概念】描述了收發消息的對象的組織關係,強調對象之間的合作關係而不是時間順序。

  • 【目的】用來顯示不同對象的關係。

圖中展示了一個線上書店的通訊圖,方框和小人表示生命線,不同生命線之間可以傳遞消息,消息前面的數字可以表達序列順序。

什麼是交互概覽圖?

  • 【概念】交互概覽圖與活動圖類似,但是它的節點是交互圖。

  • 【目的】提供了控制流的概述。

圖中表示一個調度系統的交互概覽圖,跟活動圖很像。其中sd的框代表具體的交互流程,ref框代表使用交互。

什麼是時序圖?

  • 【概念】時序圖被用來顯示隨時間變化,一個或多個元素的值或狀態的更改。也顯示時控事件之間的交互和管理它們的時間和期限約束。

  • 【目的】用來表示元素狀態或者值隨時間的變化而變化的視圖。

圖中展示了老年癡呆病人隨着時間的變化病情的變化。

總結

學習UML,我們沒必要糾結比如像聚合關係是帶箭頭還是不帶箭頭,這樣的問題。更重要的是UML圖所給我們帶來的畫圖思想,讓我們畫UML圖或者其他圖能讓其他人更好的理解我們的設計思想。

當然,你要是明確知道帶箭頭或者不帶箭頭哪個是錯誤的,歡迎留言告訴我。

參考文獻:
[1]:《Learning UML 2.0》
[2]: https://www.uml-diagrams.org/
[3]: https://www.visual-paradigm.com/guide/
[4]: https://sparxsystems.com/resources/tutorials/

最近熱文:

1、Spring Boot 2.3.1 發佈, 10 個新特性!

2、一週面試了 30 人,面到我心態爆炸…

3、求求你們別再寫滿屏的 try catch 了!

4、寫了個全局變量的bug,被同事們打臉!

5、Java 14 祭出神器,Lombok 被幹掉了?

6、爲什麼 Redis 單線程能達到百萬+QPS?

7、Spring Boot 2.3 優雅關閉新姿勢,真香!

8、Redis 到底是單線程還是多線程?

9、我天!xx.equals(null) 是什麼騷操作??

10、Struts2 爲什麼被淘汰?自己作死!

掃碼關注Java技術棧公衆號閱讀更多幹貨。

點擊「閱讀原文」獲取最新面試題~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章