一舵变、前言
很多博客里面都會涉及到UML圖,主要快速反映出程序的設計結構瘦穆,類與類之間的依賴關系等纪隙,所以這個技能還是需要掌握的。以后自己也要多畫一些扛或,這樣熟能生巧绵咱,便于掌握。
什么是UML
Unified Modeling Language (UML)又稱統(tǒng)一建模語言或標準建模語言告喊,是始于1997年一個OMG標準麸拄,它是一個支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言派昧,為軟件開發(fā)的所有階段提供模型化和可視化支持,包括由需求分析到規(guī)格拢切,到構造和配置蒂萎。
UML規(guī)范用來描述建模的概念有,類(對象的)淮椰、對象五慈、關聯(lián)、職責主穗、行為泻拦、接口、用例忽媒、包争拐、順序、協(xié)作晦雨,以及狀態(tài)架曹。
繪制UML工具
- 網頁版:https://www.processon.com/
- 軟件版:PowerDesigner(個人使用)
補充知識——類間關系
- 縱向關系:繼承
-
橫向關系:依賴(Dependency)、關聯(lián)(Association)闹瞧、聚合(Aggregation)和組合(Composition)
-
依賴:" ... uses a ..."绑雄,就是某個對象的功能依賴于另外的某個對象,而被依賴的對象只是作為一種工具在使用奥邮,而并不持有對它的引用万牺。
public class Human{ public void breath(){ Air freshAir = new Air(); freshAir.releasePower(); } public static void main(String[] args){ Human me = new Human(); while(true) { me.breath(); } } } public class Air{ public void releasePower(){ //do sth. } }
-
關聯(lián):" ... has a ...",某個對象會長期的持有另一個對象的引用洽腺,而二者的關聯(lián)往往也是相互的脚粟。關聯(lián)的兩個對象彼此間沒有任何強制性的約束,只要二者同意已脓,可以隨時解除關系或是進行關聯(lián)珊楼,它們在生命期問題上沒有任何約定通殃。被關聯(lián)的對象還可以再被別的對象關聯(lián)度液,所以關聯(lián)是可以共享的。
public class Human{ private ArrayList friends = new ArrayList(); public void makeFriend(Human human){ friends.add(human); } public static void main(String[] args){ Human me = new Human(); while(true) me.makeFriend(mySchool.getStudent()); } }
-
聚合:" ... owns a ..."画舌,聚合是強版本的關聯(lián)堕担,它暗含著一種所屬關系以及生命期關系。被聚合的對象還可以再被別的對象關聯(lián)曲聂,所以被聚合對象是可以共享的霹购。雖然是共享的,聚合代表的是一種更親密的關系朋腋。
public class Human{ private Home myHome; public void goHome(){ //在回家的路上 myHome.openDoor(); //看電視 } public static void main(String[] args){ Human me = new Human(); while(true){ //上學 //吃飯 me.goHome(); } } }
-
組合:" ... is a part of ..."齐疙,組合是關系當中的最強版本膜楷,它直接要求包含對象對被包含對象的擁有以及包含對象與被包含對象生命期的關系。被包含的對象還可以再被別的對象關聯(lián)贞奋,所以被包含對象是可以共享的赌厅,然而絕不存在兩個包含對象對同一個被包含對象的共享。組合關系就是整體與部分的關系轿塔,部分屬于整體特愿,整體不存在,部分一定不存在勾缭,然而部分不存在整體是可以存在的揍障,說的更明確一些就是部分必須創(chuàng)生于整體創(chuàng)生之后,而銷毀于整體銷毀之前俩由。部分在這個生命期內可以被其它對象關聯(lián)甚至聚合毒嫡,但有一點必須注意,一旦部分所屬于的整體銷毀了幻梯,那么與之關聯(lián)的對象中的引用就會成為空引用审胚,這一點可以利用程序來保障。
public class Human{ private Heart myHeart = new Heart(); public static void main(String[] args){ Human me = new Human(); while(true) { myHeart.beat(); } } }
-
注:依賴常常是局部變量礼旅、形參或者對靜態(tài)方法的調用膳叨,其他三個常常是成員變量。
二痘系、計算器程序的UML圖
關于上一篇文章中實現的計算器程序菲嘴,最終的UML圖可以表示為:
需要注意連線箭頭的區(qū)別。圖中一個方框代表一個類汰翠,第一行代表類的名稱龄坪,第二行表示類包含的屬性,第三行代表類中包含的方法复唤。在屬性和方法前有一個“+”修飾健田,表示public屬性,而“-”代表private屬性佛纫,“#”代表protected屬性妓局。
三、UML圖的繪制
-
總體UML圖
動物需要氧氣和水呈宇,鳥類也是一種動物好爬,它還有翅膀。大雁甥啄、鴨子都屬于鳥類存炮,多個大雁形成雁群,而企鵝的生存和氣候相關。大雁區(qū)別于其他倆種穆桂,它能夠飛翔宫盔,而唐老鴨是一種特殊的鴨子,畢竟它可以說話享完。
總體UML圖 -
依賴關系
動物類包含有生命的public屬性和新陳代謝和繁殖的public方法飘言。如果類名用斜體表示,則該類為抽象類驼侠。動物的生存需要氧氣姿鸿、水等,所以這是一個依賴關系倒源,用虛線箭頭表示即可苛预。public class Animal{ public void metaBolism(Oxygen oxygen, Water water){ ... } }
-
組合關系
組合關系是一種強的“擁有”關系,體現了嚴格的部分與整體的關系笋熬,部分和整體的生命周期一樣热某。鳥和翅膀就是一個組合關系,組合關系用實心菱形+實線箭頭來表示胳螟。同時連線倆端還有數字來表示基數昔馋,表明一個類可以擁有幾個實例。這里糖耸,顯然一個鳥有倆個翅膀秘遏。如果一個類可以擁有無數個實例,則可以用n來表示嘉竟。下面的關聯(lián)關系邦危、聚合關系也是可以有基數的。public class Bird{ private Wing wing; public Bird(){ wing = new Wing(); } }
-
聚合關系
大雁是群居動物舍扰,每只大雁都屬于一個雁群倦蚪,一個雁群可以有多個大雁,所以這是一個聚合關系边苹。聚合表示一個弱擁有關系陵且,體現的是A對象可以包含B對象,但B對象不是A對象的一部分个束。聚合關系用空心菱形+實線箭頭來表示慕购。在雁群類中,有大雁數組對象arrayWideGoose播急。public class WideGooseAggregate{ private WideGoose[] arrayWideGoose; }
-
關聯(lián)關系
企鵝是特別的鳥脓钾,會游不會飛。更重要的是桩警,它得生活在特定的氣候條件下,它需要知道氣候的變化情況昌妹,需要了解氣候規(guī)律捶枢。當一個類“知道”另一個類的時候握截,可以用關聯(lián)關系表示。關聯(lián)關系用實線箭頭表示烂叔。public class Penguin extends Animal{ private Climate climate; }
-
繼承關系
繼承關系應該非常容易理解谨胞,不多BB,關系用空心三角形+實線表示蒜鸡。public class Bird extends Animal{ ... }
-
實現接口
因為大雁胯努、企鵝和鴨中只有大雁能在高空飛翔,所以實現了飛翔接口逢防。接口圖的表示與類不同叶沛,接口在第一行有<<interface>>顯示,第二行是接口方法忘朝。書中還舉例了棒棒糖表示法表示接口灰署,可自行查看。實現接口用空心三角形+虛線表示局嘁。public interface IFly{ ... } public interface ILanguage{ ... }