標籤:class blog http tar com get
設計模式基礎:類及類別關係的UML表示
2009-10-26 17:00 by 宗哥, 1891 閱讀, 1 評論, 收藏, 編輯
UML中,類別關係分為這幾種,泛化(generalization), 實現(realization),依賴(Dependency),關聯(associate),彙總(aggregation),(composition)下面分別是UML實現及C#中的代碼錶現。
泛化(generalization)
泛化也稱作特化(specialization),用來表示一個更一般和更特殊的分類器之間的關係,從物件導向的角度來看,他表達的是類和類之間的繼承(inheritance)關係。
例如:Person(人)繼承了Organism(生物)類, Organism是更一般的分類器,Person是更特殊的分類器。
注意,泛化在語義上理解為更特殊的分類器 is kind of更一般的關係,本例我們可以理解人是生物的一種或者是一種生物。記住這點很重要。
實現(realization)
是指特殊化的分類器和介面之間的一種關係,從物件導向的角度來看,他表達的是分類器遵守並實現介面的契約(Contract)。
例如:奇瑞公司要生產一款轎車,由於產能原因發動起部分決定採用不同廠家的發動機,他只要規範這個發動機的一些參數可以。BmwEngine(寶馬發動機)和AndiEngion(奧迪發動機)實現了Engine的契約,便可以被採用。
介面表示 I can do的一種概念,例如 BmwEngine(寶馬引擎)完全可以做Engine(引擎)做的事情。
C#中 泛化(generalization)和實現(realization)的比較
我們不討論語言層面抽象類別 (abstract class) 和介面(Interface)的技術性差別。
在C#中,泛化我們主要指類和類的繼承關係,表示is kind of的關係,當然如果一個介面繼承了另外一個介面,我也主張把他劃分為泛化,這符合is kind of的觀點。實現主要指類和介面的關係,表示這個類完全實現了介面成員,I can do 。當然兩者在C#實現上都是通過符合”:”實現,但是在語義上完全是兩回事情,在UML關係圖中識別也不一樣。還要提醒你下,如果在C#中,你的類如果繼承了一個類,同時實現了一或者多個介面,一定要把類寫在所有介面的前面。
依賴(Dependency)
依賴關係是一種相對簡單的關係,表示一個類會用到另外一個類,這個關係具有相對的偶然性。他表達的是參與關係的模型元素,並不會直接轉化為程式碼(前文我們講的泛化和實現都直接轉化為程式碼了)。
例如 微軟SqlHelper類和SqlConnetciont(Sql串連),可以看做SqlHelper依賴SqlConnetciont。
依賴(Dependency)關係語義上是比較弱的一種關聯式模式,通常在以下情況我們認為A依賴於B:
1. A中的方法中有B類型的參數
2. A方法中執行個體化B或者調用了B的靜態方法
關聯(associate)
關聯我們分單項管理和雙向關聯。單相關聯表示兩個類是相關的,但是只有一個類知道這種聯絡的存在,雙向關聯兩個類彼此知道它們間的聯絡。
雙向關聯的例子:FeedIn(訂單)類和Order (訂單)類:
類FeedIn的代碼
類Order的部分代碼
可以看出,Order類知道他的Feed In,FeedIn也知道他的Order。
注意其多重值的含義:
可能的多重值描述 |
表示 |
含義 |
0..1 |
0個或1個 |
1 |
只能1個 |
0..* |
0個或多個 |
* |
0個或多個 |
1..* |
1個或我個 |
3 |
只能3個 |
0..5 |
0到5個 |
5..15 |
5到15個 |
單項關聯的例子:Order Report(訂單報表)類和訂單(Order)類:
Order Report的部分代碼
注意其箭頭編號和Order中代碼,可以看出,Order不知道Order Report(訂單報表)的存在。
C#依賴和關聯的比較
在C#中,關聯的類通常體現在類的成員變數,表示一種相對固定長期的關係,而依賴關係通常體現在局部變數,表示一種相對偶然,臨時的關係。
彙總(aggregation)
彙總也是一種關聯,但是對於關聯來講,關聯的雙方沒有明顯的主次關係,例如 FeedIn(入庫單)類和訂單(Order)類,Order Report(訂單報表)類和訂單(Order)類等等,彙總在聚集中,則有主次之分,“主”的一方只能有一個。
例如Order(訂單)和 OrderDetail(訂單明細),
Order的部分代碼
Order Detail的部分代碼
聚集關係和關聯關係的區別還表現在以下方面:
(1) 對於具有關聯關係的兩個對象,多數情況下,兩者有獨立的生命週期。FeedIn(入庫單)類和訂單(Order)類,。FeedIn(入庫單)的銷毀不會影響訂單(Order);反之亦然。
(2) 對於具有聚集關係(尤其是強聚集關係)的兩個對象,整體對象會制約它的組成對象的生命週期。部分類的對象不能單獨存在,它的生命週期依賴於整體類的對象的生命週期,當整體消失,部分也就隨之消失。例如Order(訂單)和 OrderDetail(訂單明細),不過,有的設計者也允許單獨的OrderDetail存在,這有點類似我們說的“資料島”之類的問題。
不過,在C#中表示關聯關係和聚集關係時,兩者比較相似,都是作為成員變數存在。
組合(composition)
關聯(associate)關係在設計中一般體現為彙總(aggregation)和組合(composition)關係,組合和彙總相似,但表示一種更強烈的組合語義關係:
例如Person(人)和 Head(頭),
Person(頭)類的部分代碼
Head(頭)類的部分代碼
UML圖及關係總結:
泛化(繼承):表示一般與特殊的關係,用一條實線加空心箭頭來表示;
實現:表示類與介面的關係,用一條虛線加空心箭頭來表示;
關聯:串連模型元素及連結執行個體,用一條實線來表示;
依賴:表示一個元素以某種方式依賴於另一個元素,用一條虛線加箭頭來表示;
聚集:表示整體與部分的關係,用一條實線加空心菱形來表示;
組成:表示整體與部分的有一關係,用一條實線加實心菱形來表示;