【转】30分钟学会UML类图
轉自:30分鐘學會UML類圖 - 知乎
30分鐘學會UML類圖
肖繼潮
? ? ? ?UML圖有很多種,但是并非必須掌握所有的UML圖,才能完整系統分析和設計工作。一般說來,在UML圖中,只要掌握類圖、用例圖、時序圖的使用,就能完成大部分的工作。也就是說,掌握UML的20%,就能做80%的事情。對于程序員來說,最頻繁使用的莫過于類圖。因此,這里我們只講解UML類圖。至于其它UML圖,請在以后的工作中參閱更多UML學習資料繼續學習。
? ? ? ? 類圖是面向對象系統建模中最常用和最重要的圖,是定義其它圖的基礎。類圖主要是用來顯示系統中的類、接口以及它們之間的靜態結構和關系的一種靜態模型。類圖中最基本的元素是類、接口。軟件設計師設計出類圖后,程序員就可以用代碼實現類圖中包含的內容。
類圖中具體類、抽象、接口和包的表示法
UML類圖中具體類、抽象類、接口和包有不同的表示方法。
1)在UML類圖中表示具體類
具體類在類圖中用矩形框表示,矩形框分為三層:第一層是類名字。第二層是類的成員變量;第三層是類的方法。成員變量以及方法前的訪問修飾符用符號來表示:
- “+”表示?public;
- “-”表示?private;
- “#”表示?protected;
- 不帶符號表示?default。
2)在UML類圖中表示抽象類
抽象類在UML類圖中同樣用矩形框表示,但是抽象類的類名以及抽象方法的名字都用斜體字表示,如圖2所示。
3)在UML類圖中表示接口
接口在類圖中也是用矩形框表示,但是與類的表示法不同的是,接口在類圖中的第一層頂端用構造型 <<interface>>表示,下面是接口的名字,第二層是方法,如圖3所示。此外,接口還有另一種表示法,俗稱棒棒糖表示法,就是類上面的一根棒棒糖(圓圈+實線)。圓圈旁為接口名稱,接口方法在實現類中出現。
4)在UML類圖中表示包
類和接口一般都出現在包中,UML類圖中包的表示形式如圖4所示。
在類圖中表示關系
類和類、類和接口、接口和接口之間存在一定關系,UML類圖中一般會有連線指明它們之間的關系。關系共有六種類型,分別是實現關系、泛化關系、關聯關系、依賴關系、聚合關系、組合關系,如圖6所示。
下面我們詳細講述這些關系,以及在UML類圖中如何表示這些關系。
1)實現關系
實現關系是指接口及其實現類之間的關系。在UML類圖中,實現關系用空心三角和虛線組成的箭頭來表示,從實現類指向接口,如圖1.9所示。在Java代碼中,實現關系可以直接翻譯為關鍵字?implements。
2)泛化關系
泛化關系(Generalization)是指對象與對象之間的繼承關系。如果對象A和對象B之間的“is a”關系成立,那么二者之間就存在繼承關系,對象B是父對象,對象A是子對象。例如,一個年薪制員工“is a”員工,很顯然年薪制員工Salary對象和員工Employee對象之間存在繼承關系,Employee對象是父對象,Salary對象是子對象。
在UML類圖中,泛化關系用空心三角和實線組成的箭頭表示,從子類指向父類,如圖8所示。在Java代碼中,對象之間的泛化關系可以直接翻譯為關鍵字?extends。
3)關聯關系
關聯關系(Association)是指對象和對象之間的連接,它使一個對象知道另一個對象的屬性和方法。在Java中,關聯關系的代碼表現形式為一個對象含有另一個對象的引用。也就是說,如果一個對象的類代碼中,包含有另一個對象的引用,那么這兩個對象之間就是關聯關系。
關聯關系有單向關聯和雙向關聯。如果兩個對象都知道(即可以調用)對方的公共屬性和操作,那么二者就是雙向關聯。如果只有一個對象知道(即可以調用)另一個對象的公共屬性和操作,那么就是單向關聯。大多數關聯都是單向關聯,單向關聯關系更容易建立和維護,有助于尋找可重用的類。
在UML圖中,雙向關聯關系用帶雙箭頭的實線或者無箭頭的實線雙線表示。單向關聯用一個帶箭頭的實線表示,箭頭指向被關聯的對象,如圖9所示。這就是導航性(Navigatity)。
一個對象可以持有其它對象的數組或者集合。在UML中,通過放置多重性(multipicity)表達式在關聯線的末端來表示。多重性表達式可以是一個數字、一段范圍或者是它們的組合。多重性允許的表達式示例如下:
- 數字:精確的數量
- *或者0..*:表示0到多個
- 0..1:表示0或者1個,在Java中經常用一個空引用來實現
- 1..*:表示1到多個
關聯關系又分為依賴關聯、聚合關聯和組合關聯三種類型。
4)依賴關系
依賴(Dependency)關系是一種弱關聯關系。如果對象A用到對象B,但是和B的關系不是太明顯的時候,就可以把這種關系看作是依賴關系。如果對象A依賴于對象B,則 A “use a” B。比如駕駛員和汽車的關系,駕駛員使用汽車,二者之間就是依賴關系。
在UML類圖中,依賴關系用一個帶虛線的箭頭表示,由使用方指向被使用方,表示使用方對象持有被使用方對象的引用,如圖10所示。
依賴關系在Java中的具體代碼表現形式為B為A的構造器或方法中的局部變量、方法或構造器的參數、方法的返回值,或者A調用B的靜態方法。
下面我們用代碼清單1和代碼清單2所示的Java代碼來演示對象和對象之間的依賴關系。
代碼清單1所示的B類定義了一個成員變量?field1,一個普通方法?method1()?和一個靜態方法?method2()。
//代碼清單1 B.java public class B {public String field1; //成員變量public void method1() {System.println("在類B的方法1中");}public static void method2() { //靜態方法System.out.println("在類B的靜態方法2中");} }代碼清單2所示的A類依賴于B類,在A類中定義了四個方法,分別演示四種依賴形式。
/* 代碼清單2 A.javaA依賴于B */public class A {public void method1() {//A依賴于B的第一種表現形式:B為A的局部變量B b = new B();b.method1();}public void method2() {//A依賴于B的第二種表現形式: 調用B的靜態方法B.method2();}public void method3(B b) {//A依賴于B的第三種表現形式:B作為A的方法參數String s = b.field1;}//A依賴于B的第四種表現形式:B作為A的方法的返回值public B method4() {return new B();} }5)聚合關系與組合關系
聚合(Aggregation)是關聯關系的一種特例,它體現的是整體與部分的擁有關系,即 “has a” 的關系。此時整體與部分之間是可分離的,它們可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享,所以聚合關系也常稱為共享關系。例如,公司部門與員工的關系,一個員工可以屬于多個部門,一個部門撤消了,員工可以轉到其它部門。
在UML圖中,聚合關系用空心菱形加實線箭頭表示,空心菱形在整體一方,箭頭指向部分一方,如圖11所示。
組合(Composition)也是關聯關系的一種特例,它同樣體現整體與部分間的包含關系,即 “contains a” 的關系。但此時整體與部分是不可分的,部分也不能給其它整體共享,作為整體的對象負責部分的對象的生命周期。這種關系比聚合更強,也稱為強聚合。如果A組合B,則A需要知道B的生存周期,即可能A負責生成或者釋放B,或者A通過某種途徑知道B的生成和釋放。
例如,人包含頭、軀干、四肢,它們的生命周期一致。當人出生時,頭、軀干、四肢同時誕生。當人死亡時,作為人體組成部分的頭、軀干、四肢同時死亡。
在UML圖中,組合關系用實心菱形加實線箭頭表示,實心菱形在整體一方,箭頭指向部分一方,如圖12所示。
在Java代碼形式上,聚合和組合關系中的部分對象是整體對象的一個成員變量。但是,在實際應用開發時,兩個對象之間的關系到底是聚合還是組合,有時候很難區別。在Java中,僅從類代碼本身是區分不了聚合和組合的。如果一定要區分,那么如果在刪除整體對象的時候,必須刪掉部分對象,那么就是組合關系,否則可能就是聚合關系。從業務角度上來看,如果作為整體的對象必須要部分對象的參與,才能完成自己的職責,那么二者之間就是組合關系,否則就是聚合關系。
例如,汽車與輪胎,汽車作為整體,輪胎作為部分。如果用在二手車銷售業務環境下,二者之間就是聚合關系。因為輪胎作為汽車的一個組成部分,它和汽車可以分別生產以后裝配起來使用,但汽車可以換新輪胎,輪胎也可以卸下來給其它汽車使用。如果用在駕駛系統業務環境上,汽車如果沒有輪胎,就無法完成行駛任務,二者之間就是一個組合關系。再比如網上書店業務中的訂單和訂單項之間的關系,如果訂單沒有訂單項,也就無法完成訂單的業務,所以二者之間是組合關系。而購物車和商品之間的關系,因為商品的生命周期并不被購物車控制,商品可以被多個購物車共享,因此,二者之間是聚合關系。
總結
以上是生活随笔為你收集整理的【转】30分钟学会UML类图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】矩阵变换坐标系 深入理解
- 下一篇: 不花一分钱 我让家里Wi-Fi速度翻了四