類圖(Class Diagram):
類(Class)封裝了數據和行為,是面向對象的重要組成部分,它是具有相同屬性、操作、關系的對象集合的總稱。
類一般由三部分組成:
類名(Class):每個類都必須有一個名字,類名是一個字符串。
屬性(Attributes):屬性是指類的性質,即類的成員變量。類可以有任意多個屬性,也可以沒有屬性。
UML中:可見性 名稱:類型 [= 默認值]
操作(Operations):操作是類的任意一個實例對象都可以使用的行為,操作是類的成員方法。
UML中:可見性 名稱(參數名):返回值
接下來我們看一下類的關系:
要注意uml中的關系是面向對象關系。如果不以面向對象的思維去考慮會感覺到有很多關系認為是一樣的。
關聯關系(Association):
通常關聯關系用來實現連接有關聯的對象所對應的類,即將一個類的對象作為另一個類的屬性。
還有就是關聯關系可以是單向的也可以是雙向的。雙向的符號是沒有方向標的,只是一條直線。
例:
單向:
雙向:
自己:
多重性關聯關系:
例:
在這里要注意,看完此圖中1…1以后不要認為一個Form是對應一個Button的。
不是的,應該是一個Button是對應一個Form的。1..1是表示另一個類的一個對象只與一個該類對象有關系。記住上面的表格。是另一個類與該類是什么關系。
聚合關系(Aggregation):
表示整體與部分的關系。考慮到一個整體類的組成結構。找出成員類。即成員對象是整體對象的一部分,但是成員對象可以隊里整體對象獨立存在。所以也有人說此關系是一種弱關系,那么強關系是什么后面我們會降到組成關系。
聚合關系有一個特點,那就是可替換。
直觀的來看此圖Car中必須得有一個Engine,這樣才可以認為是一個完整體。
但是這個Engine是可替換的。是以傳參的形式給Car賦一個Engine。
再次強調一下聚合是可替換的。Car中必須有一個Engine,但是此Engine可以是一個抽象的具體的Engine是在當你使用Car時可以具體去找一個合適的Engine裝到Car上就行,如果沒有Engin那么這個Car是跑不了。
組合關系(Composition):
表示整體與部分的關系。但是與聚合不同此關系是整體與部分是同生共死關系。即如果整體對象銷毀了部分也會被銷毀。
上圖Head是整體Mouth是部分,如果Head沒了Mouth也跟着銷毀了。如果Mouth沒了Head也將是面目全非。在代碼中Head中Mouth是直接new出來的。
就是說當你去new Head時Mouth也被new出來。記住一同創建一同銷毀關系。也叫強關系。那么有人會問關聯,聚合,組合我怎么認為是一樣呢。
可以說他們是一樣的都可以說是關聯關系,是的,但是關聯關系的強弱來區分了一下關聯關系強度來看組合>聚合>關聯。
依賴關系(Dependency):
是一個使用關系。特定事物的改變有可能會影響到使用該事物的其他事物。簡單說在一個類中通過另外一個類來調用其方法的表示。
從圖中可以看出Driver中使用了Car的move方法。那么就說明Driver是依賴於Car才能做Driver的職責。那么又有人會問聚合與依賴有區別嗎,當然很明顯Driver是一個整體,Car也是整體。不是整體與部分關系。
泛化關系(Generalization):
繼承(extends)關系,父類與子類關系。這個好理解直接上圖。
從圖中可以看出Student也是Person,Teacher也是Person。他們有共同的特征name,age。但是也有獨自的特征一個是study一個是teach的特征。
子類那么就是Student,Teacher父類是Person。繼承了父類那么子類可以直接適用父類的方法或屬性(家產)。
實現關系(Realization):
類實現(implements)了接口.當多個類有類似的行為方式的時候我們通常會適用接口。
Ship,Car都有move的特征他們都屬於交通工具(Vehicle)只是他們move的方式不一樣。那么我們就可以適用接口實現的方式去設計。代碼中是public class Car implements Vehicle
好我們來看一下一個完整的類圖例子:
回顧一下之前關系。去分析一下此UML的類圖。
用戶通過注冊界面(RegisterForm)輸入個人信息,
用戶點擊“注冊”按鈕后將輸入的信息通過一個封裝用戶輸入數據的對象(UserDTO)傳遞給操作數據庫的數據訪問類(DAO),
為了提高系統的擴展性,針對不同的數據庫可能需要提供不同的數據訪問類,因此提供了數據訪問類接口,
如IUserDAO,每一個具體數據訪問類都是某一個數據訪問類接口的實現類,
如OracleUserDAO就是一個專門用於訪問Oracle數據庫的數據訪問類。
UserDTO只是把userAcount,userPassword封裝了一下使用了Getter,Setter。
那么肯定是RegisterForm的成員,注冊窗體不能沒有用戶名與密碼信息所以是組合關系。RegisterForm沒有了用戶信息(UserDTO)那么就沒有意義了。
然后IUserDAO與RegisterForm是聚合關系因為是可以替換的。比如說你可以使用Oracle的以后擴展成Mysql的那么可以方便替換。
考慮到今后會擴展UserDAO所以適用了接口。
IUserDAO為什么與UserDTO是依賴關系,因為IUserDAO要把用戶信息保存到數據庫中那么必須需要用戶信息。如果沒有了用戶信息此工作無法完成所以是依賴關系