一、前言
很多博客里面都會涉及到UML圖,主要快速反映出程序的設計結構,類與類之間的依賴關系等,所以這個技能還是需要掌握的。以后自己也要多畫一些,這樣熟能生巧,便于掌握。
什么是UML
Unified Modeling Language (UML)又稱統一建模語言或標準建模語言,是始于1997年一個OMG標準,它是一個支持模型化和軟件系統開發的圖形化語言,為軟件開發的所有階段提供模型化和可視化支持,包括由需求分析到規格,到構造和配置。
UML規范用來描述建模的概念有,類(對象的)、對象、關聯、職責、行為、接口、用例、包、順序、協作,以及狀態。
繪制UML工具
- 網頁版:https://www.processon.com/
- 軟件版:PowerDesigner(個人使用)
補充知識——類間關系
- 縱向關系:繼承
-
橫向關系:依賴(Dependency)、關聯(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. } }
-
關聯:" ... has a ...",某個對象會長期的持有另一個對象的引用,而二者的關聯往往也是相互的。關聯的兩個對象彼此間沒有任何強制性的約束,只要二者同意,可以隨時解除關系或是進行關聯,它們在生命期問題上沒有任何約定。被關聯的對象還可以再被別的對象關聯,所以關聯是可以共享的。
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 ...",聚合是強版本的關聯,它暗含著一種所屬關系以及生命期關系。被聚合的對象還可以再被別的對象關聯,所以被聚合對象是可以共享的。雖然是共享的,聚合代表的是一種更親密的關系。
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 ...",組合是關系當中的最強版本,它直接要求包含對象對被包含對象的擁有以及包含對象與被包含對象生命期的關系。被包含的對象還可以再被別的對象關聯,所以被包含對象是可以共享的,然而絕不存在兩個包含對象對同一個被包含對象的共享。組合關系就是整體與部分的關系,部分屬于整體,整體不存在,部分一定不存在,然而部分不存在整體是可以存在的,說的更明確一些就是部分必須創生于整體創生之后,而銷毀于整體銷毀之前。部分在這個生命期內可以被其它對象關聯甚至聚合,但有一點必須注意,一旦部分所屬于的整體銷毀了,那么與之關聯的對象中的引用就會成為空引用,這一點可以利用程序來保障。
public class Human{ private Heart myHeart = new Heart(); public static void main(String[] args){ Human me = new Human(); while(true) { myHeart.beat(); } } }
-
注:依賴常常是局部變量、形參或者對靜態方法的調用,其他三個常常是成員變量。
二、計算器程序的UML圖
關于上一篇文章中實現的計算器程序,最終的UML圖可以表示為:
需要注意連線箭頭的區別。圖中一個方框代表一個類,第一行代表類的名稱,第二行表示類包含的屬性,第三行代表類中包含的方法。在屬性和方法前有一個“+”修飾,表示public屬性,而“-”代表private屬性,“#”代表protected屬性。
三、UML圖的繪制
-
總體UML圖
動物需要氧氣和水,鳥類也是一種動物,它還有翅膀。大雁、鴨子都屬于鳥類,多個大雁形成雁群,而企鵝的生存和氣候相關。大雁區別于其他倆種,它能夠飛翔,而唐老鴨是一種特殊的鴨子,畢竟它可以說話。
總體UML圖 -
依賴關系
動物類包含有生命的public屬性和新陳代謝和繁殖的public方法。如果類名用斜體表示,則該類為抽象類。動物的生存需要氧氣、水等,所以這是一個依賴關系,用虛線箭頭表示即可。public class Animal{ public void metaBolism(Oxygen oxygen, Water water){ ... } }
-
組合關系
組合關系是一種強的“擁有”關系,體現了嚴格的部分與整體的關系,部分和整體的生命周期一樣。鳥和翅膀就是一個組合關系,組合關系用實心菱形+實線箭頭來表示。同時連線倆端還有數字來表示基數,表明一個類可以擁有幾個實例。這里,顯然一個鳥有倆個翅膀。如果一個類可以擁有無數個實例,則可以用n來表示。下面的關聯關系、聚合關系也是可以有基數的。public class Bird{ private Wing wing; public Bird(){ wing = new Wing(); } }
-
聚合關系
大雁是群居動物,每只大雁都屬于一個雁群,一個雁群可以有多個大雁,所以這是一個聚合關系。聚合表示一個弱擁有關系,體現的是A對象可以包含B對象,但B對象不是A對象的一部分。聚合關系用空心菱形+實線箭頭來表示。在雁群類中,有大雁數組對象arrayWideGoose。public class WideGooseAggregate{ private WideGoose[] arrayWideGoose; }
-
關聯關系
企鵝是特別的鳥,會游不會飛。更重要的是,它得生活在特定的氣候條件下,它需要知道氣候的變化情況,需要了解氣候規律。當一個類“知道”另一個類的時候,可以用關聯關系表示。關聯關系用實線箭頭表示。public class Penguin extends Animal{ private Climate climate; }
-
繼承關系
繼承關系應該非常容易理解,不多BB,關系用空心三角形+實線表示。public class Bird extends Animal{ ... }
-
實現接口
因為大雁、企鵝和鴨中只有大雁能在高空飛翔,所以實現了飛翔接口。接口圖的表示與類不同,接口在第一行有<<interface>>顯示,第二行是接口方法。書中還舉例了棒棒糖表示法表示接口,可自行查看。實現接口用空心三角形+虛線表示。public interface IFly{ ... } public interface ILanguage{ ... }