類圖及類圖中的關係

1.類圖和對象圖
類圖(Class Diagram)是顯示出類、接口以及他們之間的靜態結構與關係的圖。其中最基本的單元是類或接口。
類圖不但可以表示類(或者接口)之間的關係,也可以表示對象之間的關係。下面是一個典型的類圖:
這裏寫圖片描述
類圖一般分爲幾個部分:類名、屬性、方法。下面分別講解。
(1)類名
上面的Car就是類名,如果類名是正體字,則說明該類是一個具體的類,如果類名是斜體字,則說明類是一個抽象類abstract。
(2)屬性列表
屬性可以是public、protected、private。public前面的圖標是菱形,protected對應的是菱形加鑰匙,private對應的是菱形加鎖。當然,這只是一種表現方式。我是用的是Rational Rose,如果用的是別的軟件,還可能使用+、-、#表示:+代表public、-代表private、#代表protected。
(3)方法列表
方法可以是public、protected、private。public前面的圖標是菱形,protected對應的是菱形加鑰匙,private對應的是菱形加鎖。當然,這只是一種表現方式。我是用的是Rational Rose,如果用的是別的軟件,還可能使用+、-、#表示:+代表public、-代表private、#代表protected。
對於靜態屬性,屬性名會加上一條下劃線。如上圖所示。
此外,類圖既能表示類之間的關係,還能表示對象之間的關係。二者的區別是:對象圖中對象名下面會加上一條下劃線。
2.類圖中的關係
(1)Generalization:泛化、一般化
Generalization表示的是類與類之間的繼承關係、接口與接口之間的繼承關係、類與接口之間的實現關係。如果體現到Java語言中,那就是反應extends和implements關鍵字。其典型類圖如下所示:
這裏寫圖片描述
(2)Association:關聯關係
關聯關係描述的是類與類之間的連接,他表示一個類知道另一個類的屬性和方法。關聯關係可以是單向的或者雙向的。在Java語言中,單向的關聯關係是通過以實例變量的方式持有被關聯對象的引用來實現的。一般來說是不建議使用雙向的關聯關係的。下面舉例介紹單向的關聯關係。
這裏寫圖片描述
上面的類圖表現的是騎手和馬之間的關係。Rider中有一個實例變量類型是Horse。
每個連接都會有兩個端點,上面的Rider和Horse就是端點,且每個端點都可以有(optional)一個基數(multiplicity),表示這個類可以有幾個實例。這個類似於數據庫中的1:n、m:n這些關係。我們可以給上面的例子加上基數:
這裏寫圖片描述
上面表示的是騎手與馬之間的1對n關係。
(3)Aggregation:聚合關係
聚合關係是關聯關係的一部分,是非常強的關聯關係。聚合關係表現的更多的是整體與部分的關係。例如汽車和車門、發動機之間的關係。如圖所示:
這裏寫圖片描述
與關聯關係一樣,聚合關係也是通過實例變量實現的。單純從語法的角度基本上無法判斷出關聯關係和聚合關係。
(4)Composition:組合關係
組合關係同樣也是關聯關係中的一種,這種關係是比聚合關係更加強的關係。我們前面提到,聚合關係表現的是整體與部分之間的關係,組合關係是在聚合關係的基礎上,表示不可分割的整體與部分之間的關係。也就是說表示整體的對象需要負責表示部分的對象的生命週期。
“代表整體的對象負責保持代表部分的對象的存活,在一些情況下負責將代表部分的對象湮滅掉。代表整體的對象某些時候可以將代表部分的對象傳遞給另外一個對象,並由它負責代表部分的對象的生命週期。換言之,代表部分的對象同一時刻只能與一個對象構成組合關係。並且由後者排他的負責其生命週期。”——《Java與模式》
我們以人和手臂的關係舉例,組合關係的類圖如下:
這裏寫圖片描述
(5)Dependency:依賴關係
依賴關係表示一個類依賴於另一個類的定義。依賴關係是單方向的。人吃蘋果,那麼人依賴蘋果。類圖如下:
這裏寫圖片描述
一般來說,被依賴的對象往往是以局部變量、方法參數的形式存在於來對象中,與關聯關係不同,它不會以成員變量的形式存在於以來對象中。這一點值得注意。另外,每一個依賴都有一個名稱。上面這個依賴關係的名稱就是eats。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章