UML:UMLl類圖符號 對象與類之間相互關係的類型包括:依賴、關聯、聚合、組合、泛華、實現等。

UML類圖符號 各種關係說明以及舉例

UML中描述對象和類之間相互關係的方式包括:依賴(Dependency),關聯(Association),聚合(Aggregation),組合(Composition),泛化(Generalization),實現(Realization)等。

  • 依賴(Dependency):元素A的變化會影響元素B,但反之不成立,那麼B和A的關係是依賴關係,B依賴A;類屬關係和實現關係在語義上講也是依賴關係,但由於其有更特殊的用途,所以被單獨描述。uml中用帶箭頭的虛線表示Dependency關係,箭頭指向被依賴元素。
  • 泛化(Generalization):通常所說的繼承(特殊個體 is kind of 一般個體)關係,不必多解釋了。uml中用帶空心箭頭的實線線表示Generalization關係,箭頭指向一般個體。
  • 實現(Realize):元素A定義一個約定,元素B實現這個約定,則B和A的關係是Realize,B realize A。這個關係最常用於接口。uml中用空心箭頭和虛線表示Realize關係,箭頭指向定義約定的元素。
  • 關聯(Association):元素間的結構化關係,是一種弱關係,被關聯的元素間通常可以被獨立的考慮。uml中用實線表示Association關係,箭頭指向被依賴元素。
  • 聚合(Aggregation):關聯關係的一種特例,表示部分和整體(整體 has a 部分)的關係。uml中用帶空心菱形頭的實線表示Aggregation關係,菱形頭指向整體。
  • 組合(Composition):組合是聚合關係的變種,表示元素間更強的組合關係。如果是組合關係,如果整體被破壞則個體一定會被破壞,而聚合的個體則可能是被多個整體所共享的,不一定會隨着某個整體的破壞而被破壞。uml中用帶實心菱形頭的實線表示Composition關係,菱形頭指向整體。

1.1.1       依賴(Dependency):虛線箭頭表示

1、依賴關係也是類與類之間的聯結
2、依賴總是單向的。(#add 注意,要避免雙向依賴。一般來說,不應該存在雙向依賴。)
3、依賴關係在 Java 或 C++ 語言中體現爲局部變量、方法的參數或者對靜態方法的調用。

(軟件開發中,往往會設計一些公用類,供別的類調用,如果這些公用類出問題了,那調用這些公用類的類都會因此而出問題。 
兩個元素之間的一種關係,其中一個元素(提供者)的變化將影響另一個元素(客體),或向它提供所需信息
顯示一個類引用另一個類)

方法參數示例:

複製代碼
public class Person
{
    void buy(Car car)
   {
       ...
    }
}
複製代碼

表示方法:虛線加箭頭

特點:當類與類之間有使用關係時就屬於依賴關係,不同於關聯關係,依賴不具有“擁有關係”,而是一種“相識關係”,只在某個特定地方(比如某個方法體內)纔有關係。

依賴關係可以分爲以下四類:

1)  使用依賴(Usage)表示客戶使用提供者提供的服務以實現它的行爲,包括:

  • 使用<<use>>--聲明使用一個類時需要用到已存在的另一個類。
  • 調用<<call>>--聲明一個類調用其他類的操作的方法。
  • 參數<<parameter>>--聲明一個操作和它的參數之間的關係。
  • 發送<<send>>--聲明信號發送者和信號接收者之間的關係。
  • 實例化<<instantiate>>--聲明用一個類的方法創建了另一個類的實例。

2)  抽象依賴(Abstraction)表示客戶與提供者之間用不同的方法表現同一個概念,通常一個概念更抽象,一個概念更具體。包括:

  • 跟蹤<<trace>>--聲明不同模型中的元素之間存在一些連接但不如映射精確。
  • 精化<<refine>>--聲明具有兩個不同語義層次上的元素之間的映射。
  • 派生<<derive>>--聲明一個實例可以從另一個實例導出。

3)  授權依賴(Permission)表達提供者爲客戶提供某種權限以訪問其內容的情形。包括:

  • 訪問<<access>>--允許一個包訪問另一個包的內容。
  • 導入<<import>>--允許一個包訪問另一個包的內容併爲被訪問包的組成部分增加別名。
  • 友元<<friend>>--允許一個元素訪問另一個元素,不管被訪問的元素是否具有可見性。

4)  綁定依賴(Binding)較高級的依賴類型,用於綁定模板以創建新的模型元素,包括:

  • 綁定<<bind>>--爲模板參數指定值,以生成一個新的模型元素。

 

1.1.2       關聯(Association):實線箭頭表示

1、關聯關係是類與類之間的聯結,它使一個類知道另一個類的屬性和方法。
2、關聯可以是雙向的,也可以是單向的(#add還有自身關聯)。雙向的關聯可以有兩個箭頭或者沒有箭頭,單向的關聯有一個箭頭。
3、在 Java 或 c++ 中,關聯關係是通過使用成員變量來實現的。

複製代碼
public class 徒弟
{  

}

public class 唐僧
{
     protected: list<徒弟> tdlist;
}
複製代碼

 

表示方法:實線箭頭

特徵:表示類與類或類與接口之間的依賴關係,表現爲“擁有關係”;具體到代碼可以用實例變量來表示。(A類有一個成員變量保存的是B類的一個引用,也就是說由A類可以找到B類

1.1.3       聚合(Aggregation):帶空心菱形頭表示

1、聚合關係是關聯關係的一種,是強的關聯關係。
2、聚合是整體和部分之間的關係,例如汽車由引擎、輪胎以及其它零件組成。
3、聚合關係也是通過成員變量來實現的。但是,關聯關係所涉及的兩個類處在同一個層次上,而聚合關係中,兩個類處於不同的層次上,一個代表整體,一個代表部分。
4、關聯與聚合僅僅從 Java 或 C++ 語法上是無法分辨的,必須考察所涉及的類之間的邏輯關係。

複製代碼
public class 引擎
 {

 }
public class 輪胎
 {

 }
public class 汽車
{
        protected:引擎 engine;
        protected:輪胎 tyre[4];
}
複製代碼

 

表示方法:空心菱形頭

特徵:屬於是關聯的特殊情況,體現部分-整體關係,是一種弱擁有關係;整體和部分可以有不一樣的生命週期;是一種弱關聯;

1.1.4       組合(Composition):帶實心菱形頭的實線表示

1、合成關係是關聯關係的一種,是比聚合關係還要強的關係。
2、它要求普通的聚合關係中代表整體的對象負責代表部分的對象的生命週期。

複製代碼
class 肢
 {
 }
 class 人
 {
        protected:  肢   limb[4];
 }
複製代碼

表示方法:一般是實心菱形加實線箭頭表示

特徵:屬於是關聯的特殊情況,也體現了體現部分-整體關係,是一種強“擁有關係”;整體與部分有相同的生命週期,是一種強關聯;

1.1.5       泛化(Generalization):

帶空心箭頭的實線線表示

泛化(下圖)表示一個更泛化的元素和一個更具體的元素之間的關係。泛化是用於對繼承進行建模的UML元素。在Java中,用extends關鍵字來直接表示這種關係。

泛化關係表示類與類之間的繼承關係,接口與接口之間的繼承關係。如下圖:

 

1.1.6       實現(Realization):空心箭頭和虛線表示

實例(圖I)關係指定兩個實體之間的一個合同。換言之,一個實體定義一個合同,而另一個實體保證履行該合同。對Java應用程序進行建模時,實現關係可直接用implements關鍵字來表示。表達一種說明元素與實現元素之間的關係;

圖I

 

二、相互之間的區別

1.聚合與組合

(1)聚合與組合都是一種結合關係,只是額外具有整體-部分的意涵。

(2)部件的生命週期不同

聚合關係中,整件不會擁有部件的生命週期,所以整件刪除時,部件不會被刪除。再者,多個整件可以共享同一個部件。 
組合關係中,整件擁有部件的生命週期,所以整件刪除時,部件一定會跟着刪除。而且,多個整件不可以同時間共享同一個部件。

(3)聚合關係是“has-a”關係,組合關係是“contains-a”關係。

  • “弱”包含表示如果部門沒有了,員工也可以繼續存在;
  • “強”包含表示如果部門沒有了,員工也不再存在;

在做軟件需求時,往往會將所有的包含關係畫成“弱”包含,後面發現某些關係可以表示爲“強”包含是,才轉爲實心菱形。

2.關聯和聚合

(1)表現在代碼層面,和關聯關係是一致的,只能從語義級別來區分。

(2)關聯和聚合的區別主要在語義上,關聯的兩個對象之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的。

(3)關聯是一種結構化的關係,指一種對象和另一種對象有聯繫。

(4)關聯和聚合是視問題域而定的,例如在關心汽車的領域裏,輪胎是一定要組合在汽車類中的,因爲它離開了汽車就沒有意義了。但是在賣輪胎的店鋪業務裏,就算輪胎離開了汽車,它也是有意義的,這就可以用聚合了。

3.關聯和依賴

(1)關聯關係中,體現的是兩個類、或者類與接口之間語義級別的一種強依賴關係,比如我和我的朋友;這種關係比依賴更強、不存在依賴關係的偶然性、關係也不是臨時性的,一般是長期性的,而且雙方的關係一般是平等的。

(2)依賴關係中,可以簡單的理解,就是一個類A使用到了另一個類B,而這種使用關係是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A。

4.泛化和實現

實現表示類對接口的實現關係,表示方式:用一條帶有空心三角箭頭的虛線指向接口。

泛化表示類與類之間的繼承關係、接口與接口之間的繼承關係,表示方式一條帶有空心三角箭頭的實線指向基類(父接口)。

5.綜合比較

  這幾種關係都是語義級別的,所以從代碼層面並不能完全區分各種關係;但總的來說,後幾種關係所表現的強弱程度依次爲:

          組合>聚合>關聯>依賴

  其中依賴(Dependency)的關係最弱,而關聯(Association),聚合(Aggregation),組合(Composition)表示的關係依次增強。換言之關聯,聚合,組合都是依賴關係的一種,聚合是表明對象之間的整體與部分關係的關聯,而組合是表明整體與部分之間有相同生命週期關係的聚合。

而關聯與依賴的關係用一句話概括下來就是,依賴描述了對象之間的調用關係,而關聯描述了對象之間的結構關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章