前言
上一篇文章寫了一篇建造者模式,其中有幾個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]: https://www.uml-diagrams.org/
[3]: https://www.visual-paradigm.com/guide/
[4]: https://sparxsystems.com/resources/tutorials/
歡迎關注個人微信公眾號【如逆水行舟】,用心輸出基礎、演算法、原始碼系列文章。