聲明:原創(chuàng)作品蜜唾,轉(zhuǎn)載請(qǐng)注明出處http://www.reibang.com/p/2828874af134
這篇文章來(lái)總結(jié)下UML類圖,本來(lái)不打算講UML類圖的,因?yàn)槲以趯W(xué)習(xí)設(shè)計(jì)模式的時(shí)候,一遇到有關(guān)UML的就會(huì)自動(dòng)忽略,一看感覺(jué)就很復(fù)雜硫眨。但是隨著學(xué)習(xí)的深入,發(fā)現(xiàn)不掌握UML類圖巢块,對(duì)設(shè)計(jì)模式或者某一個(gè)框架沒(méi)有整體的把控礁阁。所以與其逃避,不如敢于面對(duì)族奢,今天就讓我們一起來(lái)了解下什么是UML類圖姥闭。
說(shuō)到UML類圖,我們先來(lái)看下什么是UML歹鱼。在維基百科上對(duì)它的定義如下:
UML即
統(tǒng)一建模語(yǔ)言(Unified Modeling Language)
,它是一種開(kāi)放的方法泣栈,用于說(shuō)明、可視化弥姻、構(gòu)建和編寫(xiě)一個(gè)正在開(kāi)發(fā)的南片、面向?qū)ο蟮摹④浖芗到y(tǒng)的制品的開(kāi)放方法庭敦。UML展現(xiàn)了一系列最佳工程實(shí)踐疼进,這些最佳實(shí)踐在對(duì)大規(guī)模,復(fù)雜系統(tǒng)進(jìn)行建模方面秧廉,特別是在軟件架構(gòu)層次已經(jīng)被驗(yàn)證有效伞广。
從定義上看可能有點(diǎn)抽象拣帽,說(shuō)白了就是一種由圖表組成的標(biāo)準(zhǔn)化建模語(yǔ)言,一般我們理解的語(yǔ)言都是由文字組成嚼锄,而這種統(tǒng)一建模語(yǔ)言是由圖表組成的减拭。我們知道開(kāi)發(fā)一個(gè)軟件系統(tǒng),不光只有程序員參與区丑,另外還有分析師拧粪、設(shè)計(jì)師、測(cè)試人員等等沧侥,為了讓不同人能夠理解交流這個(gè)軟件系統(tǒng)可霎,就誕生出了這么一套語(yǔ)言。我們說(shuō)過(guò)這個(gè)語(yǔ)言是有圖表組成的宴杀,這里的圖表有好幾種類型癣朗,最常用的有:用例圖、類圖旺罢、序列圖旷余、狀態(tài)圖、活動(dòng)圖主经、組件圖和部署圖等荣暮。由于本文主要講解類圖,其他就不深入了解了罩驻,感興趣的同學(xué)可以上網(wǎng)搜索這方面的內(nèi)容。
好了言歸正傳护赊,我們重點(diǎn)看下類圖惠遏,類圖描述了我們軟件系統(tǒng)中類與類的關(guān)系。既然描述是類與類的關(guān)系骏啰,我們就先來(lái)看下一個(gè)類是如何表示的节吮,再來(lái)看下他們之間的關(guān)系。首先我們定義一個(gè)非常簡(jiǎn)單的Person類判耕,代碼如下:
public class Person {
private String name;
private int age =1;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name=name;
}
public void setAge(int age) {
this.age=age;
}
}
這個(gè)Person類很簡(jiǎn)單透绩,定義了兩個(gè)字段name和age其中age有一個(gè)初始化值1,另外定義name和age的set壁熄、get方法帚豪。很簡(jiǎn)單,然后我們來(lái)看下這個(gè)類在UML類圖中是如何表示的:
可以看到我們畫(huà)了一個(gè)矩形草丧,然后從上到下分割成三格狸臣,第一格為類名,第二格為類中字段屬性昌执,這里屬性的表達(dá)也是有一定格式的烛亦,如下:
權(quán)限 屬性名:類型 [ = 默認(rèn)值 ]
由于這里我們的name和age都是私有的诈泼,所以在前面加一個(gè)-
,另外還有其他幾種權(quán)限:public 煤禽、protected铐达、default,它們分別對(duì)應(yīng)+
檬果、#
瓮孙、~
。由于我們這里的age有一個(gè)默認(rèn)值1汁汗,所以在類型后面再加上‘=1’來(lái)表示衷畦。接下來(lái)來(lái)看下第三格,第三格為類的方法知牌,其格式如下:
權(quán)限 方法名稱(參數(shù)列表) [ : 返回類型]
也很簡(jiǎn)單祈争,相信你一看就會(huì),其中返回類型是可選項(xiàng)角寸,這里就不做過(guò)多的解釋了菩混。
類之間的關(guān)系
好了,上面我們簡(jiǎn)單了解了下扁藕,一個(gè)類在類圖中的表示方式沮峡,接下我們來(lái)了解下類與類的關(guān)系,類與類一共有如下幾種關(guān)系:泛化(Generalization)亿柑、實(shí)現(xiàn)(Realization)邢疙、依賴(Dependence)、關(guān)聯(lián)(Association)望薄、聚合(Aggregation)疟游、組合(Composition)。
想必大家一定聽(tīng)過(guò)這么一首兒歌:我在馬路邊撿到一分錢(qián)然后交給警察叔叔痕支。接下來(lái)我就根據(jù)這個(gè)故事來(lái)一個(gè)一個(gè)講解下類與類之間的關(guān)系颁虐。
泛化關(guān)系
泛化關(guān)系在Java中也叫作繼承關(guān)系,在UML中我們用帶空心三角形的直線來(lái)表示卧须,我們?cè)黾觾蓚€(gè)類另绩,一個(gè)Studen類,一個(gè)警察Policemen類花嘶,兩個(gè)類均繼承自Person類笋籽,那么他們的類關(guān)系圖表示如下:
實(shí)現(xiàn)關(guān)系
這里的實(shí)現(xiàn)關(guān)系就是Java中類與接口的實(shí)現(xiàn)關(guān)系,在UML中我們用帶空心三角形的虛線表示察绷。由于Student和Policeman都職業(yè)干签,學(xué)生的職業(yè)就是學(xué)習(xí),而警察的職業(yè)為保護(hù)人民拆撼。所有這里我們定義一個(gè)接口容劳,里面有一個(gè)職業(yè)的方法:
public interface ICareer{
void career();
}
這個(gè)接口用UML類圖表示如下:
可以看到在接口名字上多了一個(gè)<<interfac>>
字符來(lái)表示這個(gè)為接口喘沿。接下來(lái)我們讓Student和Policeman都實(shí)現(xiàn)這個(gè)接口,UML類圖如下:
依賴關(guān)系
依賴關(guān)系是一種很弱的關(guān)系竭贩,一般是指一個(gè)類使用另一個(gè)類蚜印,這里學(xué)生撿到錢(qián)交給警察叔叔,學(xué)生和警察叔叔就是一種依賴關(guān)系留量。因?yàn)閷W(xué)生撿到錢(qián)給警察是一種偶然的事情窄赋,交給警察后他們之間就沒(méi)有關(guān)系了。我們?cè)趯W(xué)生類中加入一個(gè)交錢(qián)的方法楼熄,在警察類中加入一個(gè)收錢(qián)的方法忆绰,當(dāng)調(diào)用學(xué)生的交錢(qián)方法時(shí),就調(diào)用警察的收錢(qián)方法可岂。Student的代碼如下:
public class Student{
....
....
public Policemen policemen;
.....
public void sendCoin(){
policemen.receiveCoin();
}
}
可以看到Student類中引用了Policemen類错敢,也就是說(shuō)Student依賴了Policemen,這種依賴關(guān)系我們用帶箭頭的虛線表示缕粹,箭頭指向被依賴對(duì)象稚茅,這里也就是Policemen,UML類圖表示如下:
關(guān)聯(lián)關(guān)系
關(guān)聯(lián)關(guān)系是一種比較強(qiáng)的關(guān)系平斩,他們的關(guān)系是比較持久的亚享,穩(wěn)定的。比如學(xué)生從家里出來(lái)绘面,學(xué)生和家就是一種關(guān)聯(lián)關(guān)系欺税。這種關(guān)系是比較穩(wěn)定的。關(guān)聯(lián)分單向關(guān)聯(lián)和雙向關(guān)聯(lián)揭璃,如果一個(gè)類知道或者引用了另一個(gè)類魄衅,而另一個(gè)類不知道或者沒(méi)有引用這個(gè)類,則這兩個(gè)類是單向關(guān)聯(lián)的塘辅。比如這里學(xué)生與家的關(guān)系就是單向關(guān)聯(lián)的,因?yàn)槊總€(gè)學(xué)生都是有個(gè)家的(不考慮孤兒)皆撩,但不能說(shuō)每個(gè)家里都有學(xué)生扣墩。單向關(guān)聯(lián)我們用帶箭頭的實(shí)線表示,箭頭指向被引用或者被包含的類扛吞,這里也就是家這個(gè)類呻惕。示例如下:
雙向關(guān)聯(lián)是兩個(gè)類彼此都知道對(duì)方的存在,比如老師與學(xué)生的關(guān)系就是雙向的滥比。小明的語(yǔ)文老師是張老師亚脆,張老師的學(xué)生有小明。雙向關(guān)聯(lián)用不帶箭頭的實(shí)線來(lái)連接兩個(gè)類盲泛。示例如下:
聚合關(guān)系
聚合關(guān)系是一種特殊的關(guān)聯(lián)關(guān)系濒持,聚合關(guān)系強(qiáng)調(diào)的是整體和部分的關(guān)系键耕,其中部分可以脫離整體而存在。比如雁群和一只大雁的關(guān)系柑营,就是聚合關(guān)系屈雄,大雁離開(kāi)雁群還是可以獨(dú)立存在的。再比如警察與制服的關(guān)系官套,制服也是警察的一部分酒奶,制服可以脫離警察而存在。在UML類圖中聚合用帶空心菱形的直線表示奶赔,其中菱形指向整體:
組合關(guān)系
組合關(guān)系也是一種特殊的關(guān)聯(lián)關(guān)系惋嚎,它與聚合關(guān)系很像,也是強(qiáng)調(diào)整體與部分的關(guān)系站刑,不同的是部分無(wú)法脫離整體存在另伍。比如學(xué)生用手撿錢(qián),其中手就是學(xué)生的一部分笛钝,但是手不能脫離學(xué)生而單獨(dú)存在质况。要是手能獨(dú)立存在想想就可怕。玻靡。结榄。這里我們稱學(xué)生與手為組合關(guān)系,用帶實(shí)心的菱形直線表示囤捻,其中菱形指向整體:
好了臼朗,這幾種關(guān)系到這里也就差不多了,其實(shí)你會(huì)發(fā)現(xiàn)蝎土,依賴视哑、關(guān)聯(lián)、聚合誊涯、組合這幾種關(guān)系強(qiáng)度是越來(lái)越強(qiáng)的:組合>聚合>關(guān)聯(lián)>依賴挡毅。
最后,你會(huì)發(fā)現(xiàn)你已經(jīng)不知不覺(jué)用UML類圖完成上面小學(xué)生撿錢(qián)的故事:
注:本文采用的畫(huà)圖工具為StarUML暴构,有需要的可以上網(wǎng)下一下