UML的類圖關係小結

UML的類圖首先是用來描述一個類。類用一個方框表示,方框隔成幾欄。

屬性在上,方法在下。名稱在左,類型(返回值類型)在後。抽象類抽象方法是用“斜體”

可見性的符號表示:+public,-private,#protected,~package。


關係

類其實很簡單,重要的是類與類之間的關係。

UML把類之間的關係分爲以下5種.

   ● 關聯:類A與類B的實例之間存在特定的對應關係(具體看下面)——    <——<>     <——<|>
   ● 依賴:類A訪問類B提供的服務                     ----->
   ● 聚集:類A爲整體類,類B爲局部類,類A的對象由類B的對象組合而成
   ● 泛化:類A繼承類B
   ● 實現:類A實現了B接口  

關聯依賴和聚集含義不同,需要根據具體的業務邏輯來判斷兩者到底是什麼關係。三者的強弱關係是聚集>關聯>依賴。依賴是最弱的關係。也就是說,如果A與B關聯,那麼A與B肯定依賴。聚集比較複雜,也比較好和另外兩種關係區分。而關聯強調的是兩者之間的對應關係,也就是說,如果A關聯B,那麼A的對象是使用到某一個B,而不是任何一個B,也就是說A的對象和B的對象兩者之間是關聯的。所以一般來說A如果關聯B,A對象需要保存一個B對象的引用。比如Person和IDCard,就是關聯關係,Person對象應該有一個指向IDCard對象的引用,不可能是任何一個IDCard都行。依賴則比關聯關係要弱,僅僅表示A用到B,用到哪個B無所謂。比如System.out.println(String str)方法,依賴於String,但是並不依賴於某一個具體的String,這就是依賴關係。

關聯(Association)
   關聯指的是類之間的特定對應關係,在UML中用帶實線的箭頭表示。

按照類之間的數量對比,關聯
可以分爲以下三種:
   ● 一對一關聯


   ● 一對多關聯


   ● 多對多關聯


注意:關聯還要以分爲單向關聯和雙向關聯


依賴(Dependency)
   依賴指的是類之間的調用關係,在UML中用帶虛線的箭頭表示。如果類A訪問類B的屬性或者方法,或者類A負責實例化類B,那麼可以說類A依賴類B。和關聯關係不同,無須在類A中定義類B類型的屬性。依賴是UML中很弱的一種關係,非常的普遍,哪個類補得用到十幾二十個別的類呀,如果遞歸的算下去,依賴這個關係多了去了。


聚集(Aggregation)

 聚集是一種比組合更緊密的關係。組合是指兩個類之間的對應關係。而聚集則是指這兩個類被規劃到了一個系統中,有着更緊密的聚合關係。

比如Person和EmployCard。如果系統需要定義一種Employ類型。那麼在這個系統中,這個類型就聚集了Person和EmployCard.

或者以一個空箭頭指向前面,如圖

聚集指的是整體與部分之間的關係,在UML中用帶實線的菱形箭頭表示。
聚集關係還可以分爲兩種類型:
   ● 被聚集的子系統允許被拆卸和替換,這是普通聚集關係。
   ● 被聚集的子系統不允許被拆卸和替換,這種聚集稱爲強聚集關係,或者組成關係。
    注:強聚集(組成)可用帶實線的實心菱形箭頭表示。


泛化(Generalization)
   泛化指的是類之間的繼承關係,在UML中用帶實線的三角形箭頭表示。  


實現(Realization)
   實現指的是類與接口之間的關係,在UML中用帶虛線的三角形箭頭表示。


==========================其它=================================
那依賴和聚合\組合、關聯等有什麼不同呢?關聯是類之間的一種關係,例如老師教學生,老公和老婆,水壺裝水等就是一種關係。這種關係是非常明顯的,在問題領域中通過分析直接就能得出。依賴是一種弱關聯,只要一個類用到另一個類,但是和另一個類的關係不是太明顯的時候(可以說是“uses”了那個類),就可以把這種關係看成是依賴,依賴也可說是一種偶然的關係,而不是必然的關係,就是“我在某個方法中偶然用到了它,但在現實中我和它並沒多大關係”。例如我和錘子,我和錘子本來是沒關係的,但在有一次要釘釘子的時候,我用到了它,這就是一種依賴,依賴錘子完成釘釘子這件事情。組合是一種整體-部分的關係,在問題域中這種關係很明顯,直接分析就可以得出的。例如輪胎是車的一部分,樹葉是樹的一部分,手腳是身體的一部分這種的關係,非常明顯的整體-部分關係。上述的幾種關係(關聯、聚合/組合、依賴)在代碼中可能以指針、引用、值等的方式在另一個類中出現,不拘於形式,但在邏輯上他們就有以上的區別。這裏還要說明一下,所謂的這些關係只是在某個問題域纔有效,離開了這個問題域,可能這些關係就不成立了,例如可能在某個問題域中,我是一個木匠,需要拿着錘子去幹活,可能整個問題的描述就是我拿着錘子怎麼釘桌子,釘椅子,釘櫃子;既然整個問題就是描述這個,我和錘子就不僅是偶然的依賴關係了,我和錘子的關係變得非常的緊密,可能就上升爲組合關係(讓我突然想起武俠小說的劍不離身,劍亡人亡...)。這個例子可能有點荒謬,但也是爲了說明一個道理,就是關係和類一樣,它們都是在一個問題領域中才成立的,離開了這個問題域,他們可能就不復存在了。


依賴和關聯的區別:
①     從類的屬性是否增加的角度看:發生依賴關係的兩個類都不會增加屬性。其中的一個類作爲另一個類的方法的參數或者返回值,或者是某個方法的變量而已。發生關聯關係的兩個類,其中的一個類成爲另一個類的屬性,而屬性是一種更爲緊密的耦合,更爲長久的持有關係。②     從關係的生命期角度看:依賴關係是僅當類的方法被調用時而產生,伴隨着方法的結束而結束了。關聯關係是當類實例化的時候即產生,當類銷燬的時候,關係結束。相比依賴講,關聯關係的生存期更長。

組合和聚合
簡單來看組合與聚合A和B,如果A組合B,那麼B的生命週期與A綁定,或者說是由A控制的
聚合:

public A{ B b; pubic A(B b){ // 重要:b是傳進來的,不是A創建的。 this.b=b; } }


組合

public A{ B b; pubic A(){ // 重要:b是A創建的。 b = new B(); } }

發佈了10 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章