統一模組化語言(Unified Modeling Language,縮寫UML)是非專利的第三代模組化和規約語言。
UML是一種開放的方法,用于說明、可視化、建構和編寫一個正在開發的、面向對象的、軟體密集系統的制品的開放方法。
簡介
UML分為模型和圖形兩大類。區分UML模型和UML圖是非常重要的,UML圖(包括用例圖、協作圖、活動圖、序列圖、部署圖、構件圖、類圖、狀态圖)是模型中資訊的圖表表達形式,但是UML模型獨立于UML圖存在。
核心模型
在UML系統開發中有三個主要的模型:
- 功能模型:從使用者的角度展示系統的功能,包括用例圖。
- 對象模型:采用對象,屬性,操作,關聯等概念展示系統的結構和基礎,包括類别圖、對象圖。
- 動态模型:展現系統的内部行為。包括序列圖,活動圖,狀态圖。
圖示
UML2.2中一共定義了14種圖示。
- 結構性圖形(Structure diagrams)強調的是系統式的模組化:
- 靜态圖(static diagram):包括類圖、對象圖、包圖
- 實作圖(implementation diagram):包括元件圖、部署圖
- 剖面圖
- 複合結構圖
- 行為式圖形(Behavior diagrams)強調系統模型中觸發的事件
- 活動圖
- 狀态圖
- 用例圖
- 互動性圖形(Interaction diagrams),屬于行為圖形的子集合,強調系統模型中的資料流程
- 通信圖
- 互動概述圖
- 時序圖
- 時間圖
UML類圖作用
UML展現了一系列最佳工程實踐,這些最佳實踐在對大規模,複雜系統進行模組化方面,特别是軟體架構層次方面已經被驗證有效。
我們這次介紹的主要是類圖,為了解析項目的系統結構和架構層次,可以簡潔明了的幫助我們了解項目中類之間的關系。
類圖的作用:
(1):在軟體工程中,類圖是一種靜态的結構圖,描述了系統的類的集合,類的屬性和類之間的關系,可以簡化了人們對系統的了解;
(2):類圖是系統分析和設計階段的重要産物,是系統編碼和測試的重要模型。
類圖格式
在UML類圖中,類使用包含類名、屬性(field) 和方法(method) 且帶有分割線的矩形來表示,
舉個栗子。一個Animal類,它包含name, age, state, isPet 這4個屬性,以及name相關方法。
class Animal: NSObject {
public var name: String?
internal var isPet: Bool?
fileprivate var state: String?
private var age: Int? = 0
override init() {
self.name = "no name"
self.age = 0
self.isPet = true
self.state = "dead"
}
public func getName() -> String {
return self.name!
}
internal func setName(name: String?) {
self.name = name
}
}
複制
類圖基礎屬性
+表示 public
-表示 private
#表示 protected
~表示 default,也就是包權限
_下劃線表示 static
斜體表示抽象
複制
類圖中的元素及解釋
類
- 從上到下分為三部分,分别是類名、屬性和操作。類名是必須有的
- 類如果有屬性,則每一個屬性必須有一個名字,另外還可以有其他的描述資訊,如可見性、資料類型、預設值等
- 類如果有操作,則每一個操作也都有一個名字,其他可選的資訊包括可見性、參數的名、參數類型、參數預設值和操作的傳回值的類型等
接口
一組操作的集合,隻有操作的聲明而沒有實作
抽象類
不能被執行個體化的類,一般至少包含一個抽象操作
模闆類
一種參數化的類,在編譯時把模闆參數綁定到不同的資料類型,進而産生不同的類
類與類之間關系
- 在UML類圖中,常見的有以下幾種關系:
- 泛化(Generalization)
- 實作(Realization)
- 關聯(Association)
- 聚合(Aggregation)
- 組合(Composition)
- 依賴(Dependency)
泛化
泛化(Generalization)表示類與類之間的繼承關系,接口與接口之間的繼承關系,或類對接口的實作關系
介紹: 繼承表示是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力。
表示方法:繼承使用空心三角形+實線表示,箭頭指向父類
示例: 鳥類繼承抽象類動物
實作
實作表示一個class類實作 interface 接口(可以是多個)的功能。
表示方法:
1)矩形表示法
使用空心三角形+虛線表示,箭頭指向接口類
比如:大雁需要飛行,就要實作 飛()
接口
2)棒棒糖表示法
使用實線表示
依賴
對于兩個相對獨立的對象,當一個對象負責構造另一個對象的執行個體,或者依賴另一個對象的服務時,這兩個對象之間主要展現為依賴關系。通常代碼表現為方法參數,局部變量,靜态方法調用,util類調用。
表示方法: 依賴關系用虛線箭頭表示,從依賴方指向被依賴的類
示例: 動物依賴氧氣和水。調用新陳代謝方法需要氧氣類與水類的執行個體作為參數
關聯
單向關聯
對于兩個相對獨立的對象,當一個對象的執行個體與另一個對象的一些特定執行個體存在固定的對應關系時,這兩個對象之間為關聯關系。
表示方法: 關聯關系用實線箭頭表示。
**示例:**企鵝需要‘知道’氣候的變化,需要‘了解’氣候規律。當一個類‘知道’另一個類時,可以用關聯。
雙向關聯
對于雙向關聯來說被關聯的兩個類可以感覺對方的存在
表示方法如下:
表示 | 含義 |
---|---|
0…1 | 0個或1個 |
1 | 隻能1個 |
0…* | 0個或多個 |
* | 0個或多個 |
1…* | 1個或多個 |
3 | 隻能3個 |
0…5 | 0到5個 |
5…15 | 5到15個 |
聚合
聚合是關聯關系的一種,聚合主要描述整體與部分直接的關系。需求陳述中常使用“包含”、“組成”、“分為…部分”等字句。表示一種弱的‘擁有’關系,即has-a的關系,展現的是A對象可以包含B對象,但B對象不是A對象的一部分。 兩個對象具有各自的生命周期。除了基本(一般)聚集之外,還有共享聚叢集組合聚集。
- 在聚合關系中,成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在
表示方法:聚合關系用空心的菱形+實線箭頭表示。
**示例:**每一隻大雁都屬于一個大雁群,一個大雁群可以有多隻大雁。當大雁死去後大雁群并不會消失,兩個對象生命周期不同。
組合
組合聚合是聚合的一種特殊情況,是一種強的‘擁有’關系,是一種contains-a的關系,展現了嚴格的部分和整體關系,成員對象與整體對象之間具有同生共死的關系,部分和整體的生命周期一樣。
表示方法: 組合關系用實心的菱形+實線箭頭表示,還可以使用連線兩端的數字表示某一端有幾個執行個體。
**示例:**鳥和翅膀就是組合關系,因為它們是部分和整體的關系,并且翅膀和鳥的生命周期是相同的。
模型圖示例
參考資料
- https://www.jianshu.com/p/57620b762160
- https://juejin.cn/post/6844903893327937550#heading-1
- https://zhuanlan.zhihu.com/p/456759825