UML科普文,一篇文章掌握14種UML圖
前言
上一篇文章寫了一篇建造者模式,其中有幾個UML類圖,有的讀者回饋看不懂了,我們今天就來解決一哈。
什麼是UML?
UML
是Unified Model Language
的縮寫,中文是統一建模語言
,是由一整套圖表組成的標準化建模語言。
為什麼要用UML?
通過使用UML使得在軟體開發之前,
對整個軟體設計有更好的可讀性,可理解性,從而降低開發風險。同時,也能方便各個開發人員之間的交流。
UML提供了極富表達能力的建模語言,可以讓軟體開發過程中的不同人員分別得到自己感興趣的資訊。
Page-Jones
在《Fundamental Object-Oriented Design in UML》 一書中總結了UML的主要目的,如下:
- 為用戶提供現成的、有表現力的可視化建模語言,以便他們開發和交換有意義的模型。
- 為核心概念提供可擴展性 (Extensibility) 和特殊化 (Specialization) 機制。
- 獨立於特定的程式語言和開發過程。
- 為了解建模語言提供一個正式的基礎。
- 鼓勵面向對象工具市場的發展。
- 支援更高層次的開發概念,如協作,框架,模式和組件。
- 整合最佳的工作方法 (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 Bean
和Session Bean
繼承了Bean
。EJB
擁有Remote
和Home
介面,和JAR
包。
什麼是用例圖?
- 【概念】用例圖是指由參與者、用例,邊界以及它們之間的關係構成的用於描述系統功能的視圖。
- 【目的】用來描述整個系統的功能。

用例圖中包含以下三種關係:
- 包含關係使用符號《include》,想要查看訂單列表,前提是需要先登錄。
- 擴展關係使用符號《extend》,基於查詢訂單列表的功能,可以增加一個導出數據的功能
- 泛化關係,子用例繼承父用例所有結構、行為和關係。
什麼是活動圖?
- 【概念】描述了具體業務用例的實現流程。
- 【目的】用來表示用例實現的工作流程。

圖中簡單描述了,從開始到登錄到查看訂單列表,或者登錄失敗直接結束。
什麼是狀態機圖?
- 【概念】狀態機圖對一個單獨對象的行為建模,指明對象在它的整個生命周期里,響應不同事件時,執行相關事件的順序。
- 【目的】用來表示指定對象,在整個生命周期,響應不同事件的不同狀態。

圖中描述了,門在其生命周期內所經歷的狀態。
什麼是序列圖?
- 【概念】序列圖根據時間序列展示對象如何進行協作。它展示了在用例的特定場景中,對象如何與其他對象交互。
- 【目的】通過描述對象之間發送消息的時間順序顯示多個對象之間的動態協作。

圖中展示的是支付寶條碼支付場景的序列圖。其中,
loop
是循環,alt
是選擇,序列圖的其他關係這裡就不介紹了。
什麼是通訊圖?
- 【概念】描述了收發消息的對象的組織關係,強調對象之間的合作關係而不是時間順序。
- 【目的】用來顯示不同對象的關係。

圖中展示了一個線上書店的通訊圖,方框和小人表示生命線,不同生命線之間可以傳遞消息,消息前面的數字可以表達序列順序。
什麼是交互概覽圖?
- 【概念】交互概覽圖與活動圖類似,但是它的節點是交互圖。
- 【目的】提供了控制流的概述。

圖中表示一個調度系統的交互概覽圖,跟活動圖很像。其中
sd
的框代表具體的交互流程,ref
框代表使用交互。
什麼是時序圖?
- 【概念】時序圖被用來顯示隨時間變化,一個或多個元素的值或狀態的更改。也顯示時控事件之間的交互和管理它們的時間和期限約束。
- 【目的】用來表示元素狀態或者值隨時間的變化而變化的視圖。

圖中展示了老年痴呆病人隨著時間的變化病情的變化。
總結
學習UML,我們沒必要糾結比如像聚合關係是帶箭頭還是不帶箭頭,這樣的問題。更重要的是UML圖所給我們帶來的畫圖思想,讓我們畫UML圖或者其他圖能讓其他人更好的理解我們的設計思想。
當然,你要是明確知道帶箭頭或者不帶箭頭哪個是錯誤的,歡迎留言告訴我。
參考文獻:
[1]:《Learning UML 2.0》
[2]: //www.uml-diagrams.org/
[3]: //www.visual-paradigm.com/guide/
[4]: //sparxsystems.com/resources/tutorials/
歡迎關注個人微信公眾號【如逆水行舟】,用心輸出基礎、演算法、源碼系列文章。