1. 程式人生 > 實用技巧 >統一建模語言UML簡介

統一建模語言UML簡介

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

統一建模語言UML是OMG(Object Management Group)在1997年發表的圖示式軟體設計語言,它綜合了很多種當時已經存在的建模語言、方法和過程。
UML 語言有以下重要功能:視覺化的功能、說明功能、建造功能、和建文件功能。
UML 包括以下的圖:
使用案例圖(Use case diagrams)

類圖(class diagrams)
物件圖(objectdiagrams
序列圖(Sequence diagrams)
合作圖(Collaboration diagrams)
狀態圖(Statechart diagrams)

活動圖(Activity diagrams)
構建圖(Component diagrams)
部署圖(Deployment diagrams)
在所有的圖裡面,案例圖、類圖和序列圖是最有用的。
根據這些圖的用意,可以大體上劃分為結構型圖和行為型圖。
結構型圖

圖的名字 介紹
類圖(class diagrams 類圖描述一些類、包的靜態結構和他們之間的靜態關係
物件圖(objectdiagrams 物件圖給出一個系統中的物件的快照
構建圖(Component diagrams)
描述可以部署的軟體構件(比如jar檔案、EJB)之間的靜態關係
部署圖(Deployment diagrams)

描述一個系統之間的拓撲結構

行為型圖:

圖的名字
介紹
使用案例題(Use case diagrams) 使用案例圖描述一系列的角色和使用案例及它們之間的關係,可以用來對一
個系統的最基本的行為進行建模。
活動圖(Activity diagrams)
描述不同過程之間的動態接觸,活動圖是使用案例題所描述的行為的具體化
狀態圖(Statechart diagrams)
描述一系列物件的內部狀態及狀態的變化和轉移,注意一個類不能有兩個不同
的狀態圖
序列圖(Sequence diagrams)
序列圖是一種相互作用圖,描述不同物件之間資訊傳遞的順序。
合作圖(Collaboration diagrams)

合作圖是一種相互作用圖,描述發出資訊、接收資訊的一系列物件的組織結構

類圖:


在上面的類圖中,可以看出,表示類的框分成以下幾層:
1.類名
2.屬性清單
3.方法清單
4.性質清單
一個類如果有內部類,它的類圖就有5層,在類的類圖中,除了類名層是不能省略、必須顯示以外,其他都是可以再UML圖中省略的。

第一層是類名。類名如果是正體字,說明類是可以例項化的,類名如果是斜體字,則表示類是抽象類。
第二層是屬性層。屬性可以是public、private或protected,屬性左邊是“+”,表示它是public;屬性左邊是“-”,表示它是private;屬性左邊是“#”,表示它是protected。
第三層是方法層。方法左邊是“+”,表示它是public;方法左邊是“-”,表示它是private;方法左邊是“#”,表示它是protected。方法的下面如果有一道下劃線,則表示這個方法是靜態方法。
第四層是性質層。性質由一個屬性即由一個內部變數,一個賦值函式和一個取值函式組成的結構。

描述介面的類圖:
介面的類圖和類的類圖幾乎一樣,唯一的區別是介面的名字有“interface”的字樣。

類圖中的關係:
類與類之間,會有連線指明它們之間的關係。類和類、類和介面、介面和介面之間可以建立以下幾種關係:一般化關係、關聯關係、聚合關係、合成關係和依賴關係,這幾種關係是靜態的。

一般化關係:

一般化關係表示類與類之間的繼承關係,介面與介面之間的繼承關係,或類對介面的實現關係。一般化關係是從子類指向父類的,或者從實現介面的類指向被實現的介面,與繼承或實現的方向相反。
一般化關係在java語言中可以直接翻譯為關鍵字extends 和implements。

關聯關係:

關聯關係是類與類之間的聯接,它使一個類知道另一個類的屬性和方法,關聯可以是雙向的,也可以是單向的,雙向關聯有兩個箭頭或者沒有箭頭,單向關聯有一個箭頭,表示關聯的方向,單向關聯更為普通,一般不推薦使用雙向關聯。
在java語言裡,關聯關係是使用例項變數實現的。例如上面的Dirver類中,就出現了一個型別為car的例項變數,這個變數實現了這兩個類之間的關聯關係。每個關聯都有一個名字,上面的例子中關聯的名字就是Drivers。

聚合關係:
聚合關係是關聯關係的7一種,是強的關聯關係,聚合是整體和個體之間的關係。例如汽車類與引擎類、輪胎類,以及其他的零件類之間的關係便是整個和個體的關係。

與關聯關係一樣,聚合關係也是通過例項變數來實現的,以上面的例子為例,car類中應該有個型別為Engine的屬性和型別為Tire的陣列屬性。但是關聯關係所涉及的兩個類是處在同一個層次上的,而聚合關係中,兩個類是在不平等的層次上的,一個代表整體,一個代表部分。
關聯與聚合僅僅從java語法上是分辨不出來的,需要考察所涉及的類之間的邏輯關係,如果不是很確定一個關係是不是聚合關係,可以將之設定成關聯關係。

合成關係:
合成關係是關聯關係的一種,是比聚合關係強的關係。它要求普通的聚合關係中代表整體的物件負責代表部分的物件的生命週期,合成關係是不能共享的。
代表整體的物件需要負責保持部分物件的存活,在一些情況下負責將代表部分的物件湮滅掉,代表整體的物件可以將代表部分的物件傳遞給另一個物件。由後者負責此物件的生命週期。換而言之,代表部分的物件在每個時刻只能與一個物件發生合成關係,由後者負責其生命週期。

在上面的類圖中,顯示了美猴王(MonkeyKing)以及他的四肢(limb)和他的金箍棒(GoldRingedStaff)之間的關係,可以看出MonkeyKing 與GoldRingedStaff之間是聚合的關係,而MonkeyKing與Limb 的之間的關係要比GoldRingedStaff的關係強,是合成關係。
如果不能確定一個關係是不是合成關係,可以將之看出聚合關係,甚至關聯關係。

依賴關係:
依賴也是類與類之間的連線,依賴總是單向的。依賴關係表示一個類依賴於另一個類的定義。一個人(Penson)可以買房(House)和車(Car),Penson 類依賴於House 和Car類。如圖所示:

在上面的例子中,Penson 類依賴於Car 類和 House 類的定義,因為Penson類 引用了Car 和House。與關聯關係不同的是,Penson類中沒有Car 和House的屬性,Car和House的例項是以引數的形式傳入到Penson中的buy方法中的。
一般而言,依賴關係在java語言中體現為區域性變數、方法的參量,以及對靜態方法的呼叫。換而言之,一個類A的某一個區域性變數的型別是另一個類B,那麼類A就依賴於類B。如果一個方法的參量是另一個類B的例項,那麼這個方法所在的類A依賴於類B。如果一個個類A呼叫另一個類B 的靜態方法,那麼類A 就依賴於類B。
如果類B 出現在類A 的例項變數中,那麼類A 與類B 的關係就超過了依賴關係,而變成了某一種關聯關係。
一般而言,每個類圖都應該有類、關聯關係、基數。而關聯關係的方向和關係中的角色是可選的。





轉載於:https://my.oschina.net/gao0516/blog/109655