UML類圖

「左耳朵梵高」 總第11期
寫在最前面的話
聲明:本文部分資料摘自
維基百科,還有我多年工作的積累和總結。本文很適合作為一個工具,就當是一本UML說明書,請記得收藏哦,在需要用的時候方便查閱。
什么是UML
維基百科對UML的定義:
UML(Unified Modeling Language)是一種開放的方法,用于說明、可視化、構建和編寫一個正在開發(fā)的、面向對象的、軟件密集系統(tǒng)的制品的開放方法。UML展現(xiàn)了一系列最佳工程實踐,這些最佳實踐在對大規(guī)模,復雜系統(tǒng)進行建模方面,特別是在軟件架構層次已經被驗證有效。
這個語言由葛來迪·布區(qū),伊瓦爾·雅各布森與詹姆士·蘭寶于1994年至1995年間,在Rational Software公司中開發(fā),于1996年,又進一步發(fā)展。UML集成了Booch,OMT和面向對象程序設計的概念,將這些方法融合為單一的,通用的,并且可以廣泛使用的建模語言。UML打算成為可以對并發(fā)和分布式系統(tǒng)的標準建模語言。
UML并不是一個工業(yè)標準,但在Object Management Group的主持和資助下,UML正在逐漸成為工業(yè)標準。OMG之前曾經呼吁業(yè)界向其提供有關面向對象的理論及實現(xiàn)的方法,以便制作一個嚴謹?shù)能浖UZ言(Software Modeling Language)。有很多業(yè)界的領袖亦真誠地回應OMG,幫助它創(chuàng)建一個業(yè)界標準。
從維基百科的定義中,可以總結出幾個關鍵點:
UML是一個軟件建模語言。是一個事實上的工業(yè)標準;
UML用于提供面向對象設計的理論和實現(xiàn)方法;
UML提供了一系列最佳工程實踐,在系統(tǒng)建模、軟件架構設計層次十分有效。
進一步,我們可以總結出幾個關鍵字:軟件建模語言、工業(yè)標準、面向對象、系統(tǒng)建模、架構設計、最佳時間。
在UML系統(tǒng)開發(fā)中有三個主要的模型:
功能模型 :從用戶的角度展示系統(tǒng)的功能,包括用例圖。
對象模型 :采用對象,屬性,操作,關聯(lián)等概念展示系統(tǒng)的結構和基礎,包括類圖、對象圖。
動態(tài)模型 :展現(xiàn)系統(tǒng)的內部行為。包括序列圖,活動圖,狀態(tài)圖。
UML包含了一系列的圖,最常用的有用例圖、類圖、時序圖等。本文只會涉及類圖 ,其它的圖形將在以后的文章中進行介紹。
UML類圖詳解
類描述
類 在UML中通常以實線矩形框表示。矩形框中有若干分割線。分別表示類名、屬性和方法。如下圖所示:

類名:圖中最上面的矩形框中為類名。如果字體為斜體 ,表示為抽象類 。(圖中的上面部分)屬性:類名下邊的區(qū)域。(圖中的中間部分)方法:(圖中的下面部分)
說明:屬性和方法前面的“+”、“-”和“#”表示訪問級別:
+:public-:private#:protected
接口描述
接口 的類圖表述與類大致相同,不同的是接口名要添加 Interface 標識,且行為的可見性必須用 "+" 表示。如下圖:

類和類之間的關系
類之間有六種關系:
繼承
實現(xiàn)
關聯(lián)
依賴
組合
聚合

繼承(Inherit)
繼承 是面向對象語言的三大特性(封裝,繼承,多態(tài))之一。子類繼承父類。

UML類圖中繼承關系使用空心三角形+實線表示。
實現(xiàn)(Implement)
實現(xiàn) 與繼承類似,實現(xiàn)類繼承接口中的方法。

UML類圖中實現(xiàn)關系使用空心三角形+虛線表示。
關聯(lián)
依賴關系通常表現(xiàn)為類的私有屬性。
// 企鵝類
public class Penguin {
// 天氣類
private Climate climate;
}
其UML類圖表示如下:

UML類圖中關聯(lián)使用實線箭頭表示。
依賴
依賴 關系體現(xiàn)為局部變量、方法的形參,或者對靜態(tài)方法的調用。
public class Programmer {
public void work(Computer computer){
}
}

UML類圖中依賴關系使用虛線箭頭表示。
以下代碼展示了依賴關系的三種具體代碼實現(xiàn):局部變量、方法的形參和對靜態(tài)方法的調用。
public class Person{
public void doSomething1(){
Car car = new Car();//局部變量
...
}
public void doSomething2(Car car){//方法參數(shù)
...
}
public void doSomething3(){
int price = Car.do();//靜態(tài)方法調用
}
}
組合
組合 是關聯(lián)關系的一種,表示一種強的“擁有”關系。體現(xiàn)了嚴格的部分和整體的關系。部分和整體的生命周期一樣。
public class Bird {
private Wing wing;
public Bird() {
this.wing = new Wing();
}
}

UML類圖中組合關系使用實心菱形+實線表示。
聚合
聚合 是關聯(lián)關系的一種,表示一種弱的“擁有”關系。
用Java代碼表示大雁是群居動物,每只大雁都屬于一個雁群,一個雁群可以有多只大雁。
天氣涼了,樹葉黃了。
。。。
一群大雁往南飛,一會排成“S”字,一會排成“B”字。
——《秋天》出自人教版小學語文一年級課文
public class WildGooseAggregate {
private List<WildGoose> wideGooses;
}

UML類圖中聚合關系使用空心菱形實線表示。
All in One的例子
前面介紹了類之間的6種關系。為了更好地理解這6種關系。下面使用一個完整的例子(汽車)。該示例中包含了這6種關系。

說明:
車的類圖結構為,表示車是一個抽象類;
它有兩個繼承類:小汽車和自行車;它們之間的關系為實現(xiàn) 關系,使用帶空心箭頭的虛線表示;
小汽車為與SUV之間也是繼承 關系,它們之間的關系為泛化關系,使用帶空心箭頭的實線表示;
小汽車與發(fā)動機之間是組合 關系,使用帶實心箭頭的實線表示;
學生與班級之間是聚合 關系,使用帶空心箭頭的實線表示;
學生與身份證之間為關聯(lián) 關系,使用一根實線表示;
學生上學需要用到自行車,與自行車是一種依賴 關系,使用帶箭頭的虛線表示;

我是左耳朵梵高,北理工畢業(yè),現(xiàn)任某金融咨詢公司首席架構師,曾在阿里巴巴中間件團隊任職。沉浸軟件行業(yè)十余年,相信技術能改變世界。譯有《你真的會寫代碼嗎?》
堅持輸出技術干貨,職場心得和讀書感悟。歡迎關注公眾號左耳朵梵高 ,和我一起持續(xù)學習,終生成長。