面向對象的建模中3種特別重要的關系:
依賴(dependency)是一種使用關系,多數情況下指的是一個類把另一個類作為自己操作的參數類型,如:
泛化(generalization)是父類和子類之間的關系,也稱為“is-a-kind-of”關系。沒有父類且最少有一個子類的類稱為根類或基類;把沒有子類的類稱為葉子類。如:
在上圖中Shape是基類,Square、Circle、Polygon是葉子類。
關聯(association)是一種結構關系,指明了一個事物的對象與另一個事物的對象間的聯系。
上圖顯示的是取自一個學校的信息系統中的一組類。它描述了以下幾個內容:
- 每一名學生可以學習任意門的課程,并且每一門課程也可以有任意名學生來學習。
- 每門課至少要有一名教師,每一名教師可以不教課也可以教多門課。
- 一所學??梢詻]有學生,或有多名學生,一名學生可以是多所學校的學生,通過聚合關系可以知道School是個整體,Student是School的一部分。
- 一所學??梢杂幸粋€或多個系,每個系只能屬于一個學校,通過聚合關系可以知道School是個整體,Department是School的一部分。
- 在Department和Instructor之間有兩個關聯。其中一個關聯說明一名教師可以被分配到一個或多個系中,并且一個系可以有一名或多名教師,在學校組織中,系比教師的層次要高,所以這里用聚合來建模。另一個關聯說明一個系只能有一名教師是系主任。
在UML中對關系建模時,要遵循如下策略:
- 僅當被建模的關系不是結構關系時,才能使用依賴。
- 僅當關系是“is-a-kind-of”關系時,才使用泛化。往往可以用聚合代替多繼承。
- 小心不要引入循環的泛化關系。
- 一般要保持泛化關系的平衡;繼承的層次不要太深(大約多于5層就應該想一想),也不要太寬(代之以尋找可能的中間抽象類)。
- 在對象間有結構關系的地方,要以使用關聯為主。