設計模式基礎:類及類別關係的UML表示

來源:互聯網
上載者:User

標籤: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圖及關係總結:

泛化(繼承):表示一般與特殊的關係,用一條實線加空心箭頭來表示;

實現:表示類與介面的關係,用一條虛線加空心箭頭來表示;
關聯:串連模型元素及連結執行個體,用一條實線來表示;

依賴:表示一個元素以某種方式依賴於另一個元素,用一條虛線加箭頭來表示;

聚集:表示整體與部分的關係,用一條實線加空心菱形來表示;

組成:表示整體與部分的有一關係,用一條實線加實心菱形來表示;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.