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。
以上就是類圖和常見的類圖之間的關系。最近看一些相關的書籍,發現對常見的類關系還是不熟,把自己之前的一篇博客轉過來再好好看看。
