0 簡介
◆統一建模語言(英語: Unified Modeling Language ,縮寫UML )
◆非專利的第三代建模和規約語言
◆UML是一種開放的方法
◆用於說明、可視化、構建和編寫一個正在開發的
面向對象的、軟件密集系統的製品的開放方法
◆UML展現了一系列最佳工程實踐
這些最佳實踐在對大規模,複雜系統進行建模方面,
特別是在軟件架構層次已經被驗證有效
UML2.2中一共定義了14種圖示,分類如下:
結構式圖形:強調的是系統式的建模
行爲式圖形:強調系統模型中觸發的事件
交互式圖形:屬於行爲式圖形子集合,強調系統模型中資料流程
0.1 記憶技巧
◆UML箭頭方向:從子類指向父類
◆提示:可能會認爲子類是以父類爲基礎的,箭頭應從父類指向子類
◆定義子類時需要通過extends關鍵字指定父類
◆子類-定是知道父類定義的 ,但父類並不知道子類的定義
◆只有知道對方信息時才能指向對方
- 所以箭頭方向是從子類指向父類
實線-繼承 虛線-實現
空心三角箭頭:繼承或實現
實線-繼承,isa關係,擴展目的,不虛,很結實
虛線-實現,虛線代表”虛”無實體
實線-關聯 虛線-依賴
◆虛線-依賴關係:臨時用一下,若即若離,虛無縹緲,若有若無
表示一種使用關係,一個類需要藉助另一個類來實現功能
一般是一個類使用另-個類做爲參數使用, 或作爲返回值
◆實線-關聯關係:關係穩定,實打實的關係,鐵哥們
表示一個類對象和另一個類對象有關聯
通常是一個類中有另一個類對象做爲屬性
空心菱形-聚合
- 菱形就是一個盛東西的器皿(例如盤子)
- 聚合:代表空器皿裏可以放很多相同東西,聚在一起(箭頭方向所指的類)
實心菱形-@TOC
- 組合:代表滿器皿裏已經有實體結構的存在,生死與共
- 整體和局部的關係,兩者有着獨立的生命週期,是has a的關係
- 弱關係
- 消極的詞:弱-空
整體與局部的關係,和聚合的關係相比,關係更加強烈
兩者有相同的生命週期,contains-a的關係
- 強關係
- 積極的詞:強~滿
◆常見數字表達及含義,假設有A類和B類,數字標記在A類側
0..1
:0或1個實例.
0..*
:0或多個實例.
1..1
:1個實例.
1
: 只能有一個實例.
1.. *
: 至少有一個實例.
時序圖
2 UML類圖講解- 自上而下
2.1 依賴關係(Dependency)
依賴關係是一種使用關係,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示
一個事物使用另一個事物
時使用依賴關係。大多數情況下,依賴關係體現在某個類的方法使用另一個類的對象作爲參數。
在UML中,依賴關係用帶箭頭的虛線表示
,由依賴的一方指向被依賴的一方
。
在系統實施階段,依賴關係通常通過三種方式來實現
- 第一種也是最常用的一種方式是如圖所示的將一個類的對象作爲另一個類中方法的參數
- 第二種方式是在一個類的方法中將另一個類的對象作爲其局部變量
- 第三種方式是在一個類的方法中調用另一個類的靜態方法
2.2 繼承關係(Generalization)
用於描述父類與子類之間的關係,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛化關係用帶空心三角形的直線來表示。在代碼實現時,我們使用面向對象的繼承機制來實現泛化關係,在Java語言中使用extends關鍵字
2.3 組合關係(Composition)
表示類之間整體和部分的關係,但是在組合關係中整體對象可以控制成員對象的生命週期,一旦整體對象不存在,成員對象也將不存在,成員對象與整體對象之間具有同生共死的關係.
在UML中,組合關係用帶實心菱形的直線表示
例如:HashSet及其內部的 HashMap,HashMap是HashSet的組成部分之一,而且如果HashSet沒了,HashMap也就沒了,因此他倆是組合關係
在代碼實現組合關係時,通常在整體類的構造方法中直接實例化成員類.
2.4 關聯關係(Association)
類與類之間最常用的一種關係,它是一種結構化關係,用於表示一類對象與另一類對象之間有聯繫
如汽車和輪胎、師傅和徒弟、班級和學生等等。
在UML類圖中,用實線連接有關聯關係的對象所對應的類
在使用Java實現關聯關係時,通常將一個類的對象作爲另一個類的成員變量
在使用類圖表示關聯關係時可以在關聯線上標註角色名,一般使用一個表示兩者之間關係的動詞或者名詞表示角色名(有時該名詞爲實例對象名),關係的兩端代表兩種不同的角色,因此在一個關聯關係中可以包含兩個角色名,角色名不是必須的,可以根據需要增加,其目的是使類之間的關係更加明確。
如在一個登錄界面類LoginForm中包含一個JButton類型的註冊按鈕loginButton,它們之間可以表示爲關聯關係,代碼實現時可以在LoginForm中定義一個名爲loginButton的屬性對象,其類型爲JButton
在UML中,關聯關係通常又包含如下幾種形式:
2.4.1 雙向關聯
默認情況下,關聯是雙向的
例如:顧客(Customer)購買商品(Product)並擁有商品,反之,賣出的商品總有某個顧客與之相關聯。因此,Customer類和Product類之間具有雙向關聯關係
public class Customer {
private Product[] products;
……
}
public class Product {
private Customer customer;
……
}
2.4.2 單向關聯
類的關聯關係也可以是單向的,單向關聯用帶箭頭的實線表示
例如:顧客(Customer)擁有地址(Address),則Customer類與Address類具有單向關聯關係,如圖3所示:
public class Customer {
private Address address;
……
}
public class Address {
……
}
2.4.3 自關聯
在系統中可能會存在一些類的屬性對象類型爲該類本身,這種特殊的關聯關係稱爲自關聯
例如:一個節點類(Node)的成員又是節點Node類型的對象
public class Node {
private Node subNode;
……
}
2.4.4 多重性關聯
多重性關聯關係又稱爲重數性(Multiplicity)關聯關係,表示兩個關聯對象在數量上的對應關係
在UML中,對象之間的多重性可以直接在關聯直線上用一個數字或一個數字範圍表示。
對象之間可以存在多種多重性關聯關係
例如:一個界面(Form)可以擁有零個或多個按鈕(Button),但是一個按鈕只能屬於一個界面,因此,一個Form類的對象可以與零個或多個Button類的對象相關聯,但一個Button類的對象只能與一個Form類的對象關聯,如圖5所示:
public class Form {
private Button[] buttons; //定義一個集合對象
……
}
public class Button {
……
}
2.5 聚合關係(Aggregation)
表示整體與部分的關係 has-a 關係
在聚合關係中,成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在
在UML中,聚合關係用帶空心菱形的直線表示
在代碼實現聚合關係時,成員對象通常作爲構造方法、Setter方法或業務方法的參數注入到整體對象中,
2.6 接口與實現關係
在很多面嚮對象語言中都引入了接口的概念,如Java,在接口中,通常沒有屬性,而且所有的操作都是抽象的,只有操作的聲明,沒有操作的實現
UML中用與類的表示法類似的方式表示接口
接口之間也可以有與類之間關係類似的繼承關係和依賴關係,但是接口和類之間還存在一種實現(Realization)關係,在這種關係中,類實現了接口,類中的操作實現了接口中所聲明的操作。在UML中,類與接口之間的實現關係用帶空心三角形的虛線來表示
實現關係在編程實現時,不同的面嚮對象語言也提供了不同的語法,如在Java語言中使用implements關鍵字
在UML 2.0的13種圖形中,類圖是使用頻率最高的UML圖之一。Martin Fowler在其著作《UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition》(《UML精粹:標準對象建模語言簡明指南(第3版)》)中有這麼一段:“If someone were to come up to you in a dark alley and say, ‘Psst, wanna see a UML diagram?’ that diagram would probably be a class diagram. The majority of UML diagrams I see are class diagrams.”(“如果有人在黑暗的小巷中向你走來並對你說:‘嘿,想不想看一張UML圖?’那麼這張圖很有可能就是一張類圖,我所見過的大部分的UML圖都是類圖”),由此可見類圖的重要性。
類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。
1 類
類(Class)封裝了數據和行爲,是面向對象的重要組成部分,它是具有相同屬性、操作、關係的對象集合的總稱。在系統中,每個類都具有一定的職責,職責指的是類要完成什麼樣的功能,要承擔什麼樣的義務。一個類可以有多種職責,設計得好的類一般只有一種職責。在定義類的時候,將類的職責分解成爲類的屬性和操作(即方法)。類的屬性即類的數據職責,類的操作即類的行爲職責。設計類是面向對象設計中最重要的組成部分,也是最複雜和最耗時的部分。
在軟件系統運行時,類將被實例化成對象(Object),對象對應於某個具體的事物,是類的實例(Instance)。
類圖(Class Diagram)使用出現在系統中的不同類來描述系統的靜態結構,它用來描述不同的類以及它們之間的關係。
在系統分析與設計階段,類通常可以分爲三種,分別是實體類(Entity Class)、控制類(Control Class)和邊界類(Boundary Class),下面對這三種類加以簡要說明:
(1) 實體類:實體類對應系統需求中的每個實體,它們通常需要保存在永久存儲體中,一般使用數據庫表或文件來記錄,實體類既包括存儲和傳遞數據的類,還包括操作數據的類。實體類來源於需求說明中的名詞,如學生、商品等。
(2) 控制類:控制類用於體現應用程序的執行邏輯,提供相應的業務操作,將控制類抽象出來可以降低界面和數據庫之間的耦合度。控制類一般是由動賓結構的短語(動詞+名詞)轉化來的名詞,如增加商品對應有一個商品增加類,註冊對應有一個用戶註冊類等
(3) 邊界類:邊界類用於對外部用戶與系統之間的交互對象進行抽象,主要包括界面類,如對話框、窗口、菜單等。
在面向對象分析和設計的初級階段,通常首先識別出實體類,繪製初始類圖,此時的類圖也可稱爲領域模型,包括實體類及其它們之間的相互關係。
1.1 類的UML圖示
在UML中,類使用包含類名、屬性和操作且帶有分隔線的長方形來表示
如定義一個Employee類,它包含屬性name、age和email,以及操作modifyInfo()
對應的Java代碼片段如下:
public class Employee {
private String name;
private int age;
private String email;
public void modifyInfo() {
......
}
}
在UML類圖中,類一般由三部分組成:
1.1.1 類名
每個類都必須有一個名字,類名是一個字符串
1.1.2 類的屬性
屬性是指類的性質,即類的成員變量。一個類可以有任意多個屬性,也可以沒有屬性
屬性的表示方式
可見性 名稱:類型 [ = 缺省值 ]
-
“可見性” 表該屬性對於類外的元素而言是否可見
包括公有(public)、私有(private)和受保護(protected)三種,在類圖中分別用符號+、-和#表示。 -
“名稱”表示屬性名,用一個字符串表示。
-
“類型”表示屬性的數據類型,可以是基本數據類型,也可以是用戶自定義類型。
-
“缺省值”是一個可選項,即屬性的初始值。
1.1.3 類的操作
操作是類的任意一個實例對象都可以使用的行爲,是類的成員方法
UML規定操作的表示方式爲:
可見性 名稱(參數列表) [ : 返回類型]
其中:
- “可見性”的定義與屬性的可見性定義相同。
- “名稱”即方法名,用一個字符串表示。
- “參數列表”表示方法的參數,其語法與屬性的定義相似,參數個數是任意的,多個參數之間用逗號“,”隔開。
- “返回類型”是一個可選項,表示方法的返回值類型,依賴於具體的編程語言,可以是基本數據類型,也可以是用戶自定義類型,還可以是空類型(void),如果是構造方法,則無返回類型。
操作method1的可見性爲public(+),帶入了一個Object類型的參數par,返回值爲空(void)
操作method2的可見性爲protected(#),無參數,返回值爲String類型
操作method3的可見性爲private(-),包含兩個參數,其中一個參數爲int類型,另一個爲int[]類型,返回值爲int類型
由於在Java語言中允許出現內部類,因此可能會出現包含四個部分的類圖
其中的 sex,oalyGames 下劃線表明爲 static 靜態性
study 斜體:抽象方法
GeelyClass 爲斜體:抽象類