|
來源:如逆水行舟 前言上一篇文章寫了一篇建造者模式,其中有幾個UML類圖,有的讀者反饋看不懂了,我們今天就來解決一哈。 什么是UML?UML是Unified Model Language的縮寫,中文是統(tǒng)一建模語言,是由一整套圖表組成的標準化建模語言。
為什么要用UML?通過使用UML使得在軟件開發(fā)之前,對整個軟件設(shè)計有更好的可讀性,可理解性,從而降低開發(fā)風險。同時,也能方便各個開發(fā)人員之間的交流。 UML提供了極富表達能力的建模語言,可以讓軟件開發(fā)過程中的不同人員分別得到自己感興趣的信息。 Page-Jones 在《Fundamental Object-Oriented Design in UML》 一書中總結(jié)了UML的主要目的,如下:
- 為用戶提供現(xiàn)成的、有表現(xiàn)力的可視化建模語言,以便他們開發(fā)和交換有意義的模型。
- 為核心概念提供可擴展性 (Extensibility) 和特殊化 (Specialization) 機制。
- 支持更高層次的開發(fā)概念,如協(xié)作,框架,模式和組件。
- 整合最佳的工作方法 (Best Practices)。
UML圖有哪些?- 結(jié)構(gòu)圖分為類圖、輪廓圖、組件圖、組合結(jié)構(gòu)圖、對象圖、部署圖、包圖。
- 行為圖又分活動圖、用例圖、狀態(tài)機圖和交互圖。
 UML圖概覽 什么是類圖?- 【概念】類圖是一切面向?qū)ο蠓椒ǖ暮诵慕9ぞ?。類圖描述了系統(tǒng)中對象的類型以及它們之間存在的各種靜態(tài)關(guān)系。
- 【目的】用來表示類、接口以及它們之間的靜態(tài)結(jié)構(gòu)和關(guān)系。
?在類圖中,常見的有以下幾種關(guān)系。 ? 泛化(Generalization)- 【泛化關(guān)系】是一種繼承關(guān)系,表示子類繼承父類的所有特征和行為。
 實現(xiàn)(Realization)- 【實現(xiàn)關(guān)系】是一種類與接口的關(guān)系,表示類是接口所有特征和行為的實現(xiàn)。
 關(guān)聯(lián)(Association)- 【關(guān)聯(lián)關(guān)系】是一種擁有關(guān)系,它使得一個類知道另一個類的屬性和方法。
- 【箭頭指向】帶普通箭頭的實線,指向被擁有者。雙向的關(guān)聯(lián)可以有兩個箭頭,或者沒有箭頭。單向的關(guān)聯(lián)有一個箭頭。
 ?自己買的車,想什么時候開就開。但是車是車,人是人,沒有整體與部分的關(guān)系。 ? 聚合(Aggregation)- 【聚合關(guān)系】是一種整體與部分的關(guān)系。且部分可以離開整體而單獨存在。聚合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強的關(guān)聯(lián)關(guān)系;關(guān)聯(lián)和聚合在語法上無法區(qū)分,必須考察具體的邏輯關(guān)系。
 ?電腦有鍵盤才能輸入信息,電腦是整體,鍵盤是部分,鍵盤也可以離開電腦,單純的拿去敲。所以是聚合。 ? 組合(Composition)- 【組合關(guān)系】是一種整體與部分的關(guān)系。但部分不能離開整體而單獨存在,組合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系還要強的關(guān)系。
- 【箭頭指向】帶實心菱形和普通箭頭的實線,實心菱形指向整體。
 ?鳥是整體,翅膀是部分。鳥死了,翅膀也就不能飛了。所以是組合。我們再看一下,下面的一組經(jīng)典的聚合組合關(guān)系的例子。 ?  ?一個公司擁有多個部門,公司和部門之間是組合關(guān)系,公司破產(chǎn)了,部門就不復(fù)存在了。部門和員工是聚合關(guān)系,部門被裁掉,員工就換下家了。 ? 依賴(Dependency)- 【依賴關(guān)系】是一種使用關(guān)系,即一個類的實現(xiàn)需要另一個類的協(xié)助。
- 【箭頭指向】帶普通箭頭的虛線,普通箭頭指向被使用者。
 ?老司機只管開車,車是誰的不重要,給什么車開什么車。 ? 什么是組件圖?- 【概念】描繪了系統(tǒng)中組件提供的、需要的接口、端口等,以及它們之間的關(guān)系。
- 【目的】用來展示各個組件之間的依賴關(guān)系。
 ?訂單系統(tǒng)組件依賴于客戶資源庫和庫存系統(tǒng)組件。中間的虛線箭頭表示依賴關(guān)系。另外兩個符號,表示組件連接器,一個提供接口,一個需要接口。 ? 什么是部署圖?- 【概念】描述了系統(tǒng)內(nèi)部的軟件如何分布在不同的節(jié)點上。
- 【目的】用來表示軟件和硬件的映射關(guān)系。
 ?圖中簡單的表示,不同機器上面部署的不同軟件。 ? 什么是對象圖?- 【概念】對象圖是類圖的一個實例,是系統(tǒng)在某個時間點的詳細狀態(tài)的快照。
- 【目的】用來表示兩個或者多個對象之間在某一時刻之間的關(guān)系。
 ?圖中就是描述的,某時間點bat這個公司有一個研發(fā)部,一個銷售部,兩個部門只有一個人iisheng。 ? 什么是包圖?- 【概念】描繪了系統(tǒng)在包層面上的結(jié)構(gòu)設(shè)計。
- 【目的】用來表示包和包之間的依賴關(guān)系。
 - 《Use》關(guān)系表示使用依賴,
Web Shopping依賴Payment - 《Merge》關(guān)系表示合并,
Web Shopping合并了Shopping Cart就擁有了Shopping Cart的功能 - 《Access》關(guān)系表示私有引入,比如代碼中的指定包名類名
- 《Import》關(guān)系表示公共引入,比如Java中的
import之后,就可以直接使用import包中的類了。
什么是組合結(jié)構(gòu)圖?- 【概念】描述了一個'組合結(jié)構(gòu)'的內(nèi)部結(jié)構(gòu),以及他們之間的關(guān)系。這個'組合結(jié)構(gòu)'可以是系統(tǒng)的一部分,或者一個整體。
- 【目的】用來表示系統(tǒng)中邏輯上的'組合結(jié)構(gòu)'。
 ?圖中描述了Car是由車軸連接著的兩個前面輪子、兩個后面輪子,和引擎組合的。 ? 什么是輪廓圖?- 【概念】輪廓圖提供了一種通用的擴展機制,用于為特定域和平臺定制UML模型。
- 【目的】用于在特定領(lǐng)域中構(gòu)建UML模型。
 ?圖中我們定義了一個簡易的EJB的概要圖。Bean是從Component擴展來的。Entity Bean和Session Bean繼承了Bean。EJB擁有Remote和Home接口,和JAR包。 ? 什么是用例圖?- 【概念】用例圖是指由參與者、用例,邊界以及它們之間的關(guān)系構(gòu)成的用于描述系統(tǒng)功能的視圖。
 用例圖中包含以下三種關(guān)系: - 包含關(guān)系使用符號《include》,想要查看訂單列表,前提是需要先登錄。
- 擴展關(guān)系使用符號《extend》,基于查詢訂單列表的功能,可以增加一個導出數(shù)據(jù)的功能
- 泛化關(guān)系,子用例繼承父用例所有結(jié)構(gòu)、行為和關(guān)系。
什么是活動圖?- 【概念】描述了具體業(yè)務(wù)用例的實現(xiàn)流程。
 ?圖中簡單描述了,從開始到登錄到查看訂單列表,或者登錄失敗直接結(jié)束。 ? 什么是狀態(tài)機圖?- 【概念】狀態(tài)機圖對一個單獨對象的行為建模,指明對象在它的整個生命周期里,響應(yīng)不同事件時,執(zhí)行相關(guān)事件的順序。
- 【目的】用來表示指定對象,在整個生命周期,響應(yīng)不同事件的不同狀態(tài)。
 ?圖中描述了,門在其生命周期內(nèi)所經(jīng)歷的狀態(tài)。 ? 什么是序列圖?- 【概念】序列圖根據(jù)時間序列展示對象如何進行協(xié)作。它展示了在用例的特定場景中,對象如何與其他對象交互。
- 【目的】通過描述對象之間發(fā)送消息的時間順序顯示多個對象之間的動態(tài)協(xié)作。
 ?圖中展示的是支付寶條碼支付場景的序列圖。其中,loop是循環(huán),alt是選擇,序列圖的其他關(guān)系這里就不介紹了。 ? 什么是通訊圖?- 【概念】描述了收發(fā)消息的對象的組織關(guān)系,強調(diào)對象之間的合作關(guān)系而不是時間順序。
 ?圖中展示了一個線上書店的通訊圖,方框和小人表示生命線,不同生命線之間可以傳遞消息,消息前面的數(shù)字可以表達序列順序。 ? 什么是交互概覽圖?- 【概念】交互概覽圖與活動圖類似,但是它的節(jié)點是交互圖。
 ?圖中表示一個調(diào)度系統(tǒng)的交互概覽圖,跟活動圖很像。其中sd的框代表具體的交互流程,ref框代表使用交互。 ? 什么是時序圖?- 【概念】時序圖被用來顯示隨時間變化,一個或多個元素的值或狀態(tài)的更改。也顯示時控事件之間的交互和管理它們的時間和期限約束。
- 【目的】用來表示元素狀態(tài)或者值隨時間的變化而變化的視圖。
 ?圖中展示了老年癡呆病人隨著時間的變化病情的變化。 ? 總結(jié)學習UML,我們沒必要糾結(jié)比如像聚合關(guān)系是帶箭頭還是不帶箭頭,這樣的問題。更重要的是UML圖所給我們帶來的畫圖思想,讓我們畫UML圖或者其他圖能讓其他人更好的理解我們的設(shè)計思想。 當然,你要是明確知道帶箭頭或者不帶箭頭哪個是錯誤的,歡迎留言告訴我。 參考文獻: [1]:《Learning UML 2.0》 [2]: https://www./ [3]: https://www./guide/ [4]: https:///resources/tutorials/
Java面試題專欄 【71期】面試官:對并發(fā)熟悉嗎?談?wù)勀銓ava中常用的幾種線程池的理解
【72期】面試官:對并發(fā)熟悉嗎?說一下synchronized與Lock的區(qū)別與使用
【73期】面試官:Spring 和 Spring Boot 的區(qū)別是什么?
【74期】面試官:對多線程熟悉嗎,來談?wù)劸€程池的好處?
【75期】面試官:說說Redis的過期鍵刪除策略吧?。ǜ哳l)
【76期】面試官問:List如何一邊遍歷,一邊刪除?
【77期】這一道面試題就考驗了你對Java的理解程度
【78期】別找了,Java集合面試問題這里幫你總結(jié)好了!
【79期】別找了,回答Spring中Bean的生命周期,這里幫你總結(jié)好了!
【80期】說出Java創(chuàng)建線程的三種方式及對比
|