Java 大白話講解設(shè)計(jì)模式之 -- UML類圖

聲明:原創(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類圖中是如何表示的:

單個(gè)類圖

可以看到我們畫(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)系圖表示如下:


泛化關(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類圖如下:

實(shí)現(xiàn)關(guān)系

依賴關(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)系

關(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)

雙向關(guān)聯(lián)是兩個(gè)類彼此都知道對(duì)方的存在,比如老師與學(xué)生的關(guān)系就是雙向的滥比。小明的語(yǔ)文老師是張老師亚脆,張老師的學(xué)生有小明。雙向關(guān)聯(lián)用不帶箭頭的實(shí)線來(lái)連接兩個(gè)類盲泛。示例如下:


雙向關(guān)聯(lián)

聚合關(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)系也是一種特殊的關(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)系

好了臼朗,這幾種關(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)下一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跪呈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子取逾,更是在濱河造成了極大的恐慌耗绿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砾隅,死亡現(xiàn)場(chǎng)離奇詭異误阻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)究反,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寻定,“玉大人,你說(shuō)我怎么就攤上這事奴紧√亟悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵黍氮,是天一觀的道長(zhǎng)唐瀑。 經(jīng)常有香客問(wèn)我蜻拨,道長(zhǎng)暴浦,這世上最難降的妖魔是什么洲尊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮专执,結(jié)果婚禮上淮捆,老公的妹妹穿的比我還像新娘。我一直安慰自己本股,他們只是感情好攀痊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拄显,像睡著了一般苟径。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躬审,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天棘街,我揣著相機(jī)與錄音,去河邊找鬼承边。 笑死遭殉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的博助。 我是一名探鬼主播险污,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼富岳!你這毒婦竟也來(lái)了罗心?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤城瞎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后疾瓮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脖镀,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜒灰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弦蹂。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖强窖,靈堂內(nèi)的尸體忽然破棺而出凸椿,到底是詐尸還是另有隱情,我是刑警寧澤翅溺,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布脑漫,位于F島的核電站,受9級(jí)特大地震影響咙崎,放射性物質(zhì)發(fā)生泄漏优幸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一褪猛、第九天 我趴在偏房一處隱蔽的房頂上張望网杆。 院中可真熱鬧,春花似錦伊滋、人聲如沸碳却。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昼浦。三九已至,卻和暖如春燥撞,著一層夾襖步出監(jiān)牢的瞬間座柱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工物舒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留色洞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓冠胯,卻偏偏與公主長(zhǎng)得像火诸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荠察,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容