UML 中關系詳解以及在visio中的表示


Uml 關系主要有四大類: 依賴,關聯,泛化,實現。

其中 依賴和關聯是事物之間語義上的橫向關系,泛化和實現是事物之間的縱向關系。

一:依賴 Dependency

圖示:----->

定義:關系最為松散的,單向的,暫時產生關系的事物之間使用。

使用圖例:在靜態圖、組件圖、部署圖中兩事物的弱依賴關系用此圖示。

二:關聯 Association

圖示:此圖為visio中畫法(在uml靜態結構中,拖動復合圖例,然后雙擊此圖例,將出現下圖,在關聯端list中,聚合列都選擇無,然后在isNavigable列中選擇划箭頭的端。然后點選確定,就出現右側的關聯圖例)。

 

定義:兩事物之間的比較密切關系。

實體之間的一個結構化關系表明對象是相互連接的。箭頭是可選的,它用於指定導航能力。如果沒有箭頭,暗示是一種雙向的導航能力。關聯轉換為一個實例作用域的變量。可為一個關聯附加其他修飾符。多重性(Multiplicity)修飾符暗示着實例之間的關系。

使用圖例:在靜態圖中使用,其他圖中也有類似的關聯關系,但細化為其他關系。

其中具體細分了兩種關系:聚合和組合。

1聚合 Aggregation

圖示:此圖為visio中畫法(在uml靜態結構中,拖動復合圖例,然后雙擊此圖例,將出現下圖,在關聯端list中,在聚合列中在需划箭頭端選擇共享選項。然后點選確定,就出現左側的聚合圖例)。

定義:整體和個體之間的關系,個體生命周期的消亡對整體生命周期沒有太大的影響。has a的關系。

聚合是關聯的一種形式,代表兩個類之間的整體/局部關系。聚合暗示着整體在概念上處於比局部更高的一個級別,而關聯暗示兩個類在概念上位於相同的級別。聚合也轉換成一個實例作用域變量。
關聯和聚合的區別純粹是概念上的,而且嚴格反映在語義上。聚合還暗示着實例圖中不存在回路。換言之,只能是一種單向關系。

2組合 Composition

圖示:此圖為visio中畫法(在uml靜態結構中,直接拖動復合圖例)

定義:整體和個體之間的關系,contains a 的關系。

組合是聚合的一種特殊形式,暗示“局部”在“整體”內部的生存期職責。組合也是非共享的。所以,雖然局部不一定要隨整體的銷毀而被銷毀,但整體要么負責保持局部的存活狀態,要么負責將其銷毀。局部不可與其他整體共享。但是,整體可將所有權轉交給另一個對象,后者隨即將承擔生存期職責。

在visio中 聚合和組合關系被分別稱之為共享和復合關系。主要在靜態圖中使用。菱形為整體一端,另一端為個體。

三:泛化 Generalization

圖示:此圖為visio中畫法(在uml靜態結構中,直接拖動歸納圖例)

定義:特殊到一般的關系。在軟件開發中被稱為繼承關系,is a 的關系。

四:實現 Realization

圖示:此圖為visio中畫法(右擊類,然后選擇形狀顯示選項,然后再勾選如左邊所示的實現鏈接,點選確定,此時選擇此類例圖,將出現黃色菱形,點選黃色菱形,然后划線到要關聯的事物中。即出現此虛箭頭線)。

定義:類元之間的實現關系,在軟件開發中被稱為實現接口,或者抽象類之間的實現關系。

 

另外在用例圖中,存在3種關系

1:參與者與參與者之間泛化關系,即visio中的歸納圖例。

2:參與者與用例之間用依賴關系。即visio中的通信圖例。

3:用例與用例之間用關聯關系,即拖拽visio中的擴展圖例。有時也可以用泛化關系。

其中關聯分為兩類:include關系,extends關系。

1)包含關系:把幾個用例的公共步驟分離成一個被包含的用例,用例間的包含關系允許包含提供者用例的行為到客戶用例中.把包含用例稱為客戶用例,被包含用例稱為提供者用例.包含用例提供功能給客戶用例。通俗一點講就是把一個復雜的事物,拆分成幾部分,整體和部分之間用包含關系。

2)擴展關系:是把新行為插入到已有用例中的方法.基礎用例提供了一組擴展點.這些擴展點可以添加新的行為.而擴展用例提供了一組插入片段.這些片段能插入到基礎用例的擴展點。將基用例中一段相對獨立並且可選的動作,用擴展(Extension)用例加以封裝,再讓它從基用例中聲明的擴展點(Extension Point)上進行擴展,從而使基用例行為更簡練和目標更集中,做基事件之后,我可能做擴展事件,也可能不做(在特殊情況下需要的新功能,擴展點就是特殊情況)。通俗一點講就是一個操作,可以有多種選擇方式,每種方式都可以實現此功能。多個實現和功能接口之間是一種擴展關系。

3)泛化關系:用例的泛化關系與類的泛化關系相似,即在用例泛化中,子用例表示父用例的特殊形式,子用例從父用例繼承了行為和屬性,還可以添加行為和屬性,改變已繼承的行為。子用例可以使用父用例的一段行為,也可以重載它。父用例通常是抽象的。在實際應用中很少使用泛化關系,子用例中的特殊行為都可以作為父用例中的備選流存在。

 

包含以及擴展過程與泛化過程類似

共性:都是從現有的用例中抽取出公共的那部分信息,作為一個單獨的用例,然后通后過不同的方法來重用這個公共的用例,以減少模型維護的工作量

但三者對用例關系的優化側重點是不同的。如下:
          ●泛化側重表示子用例間的互斥性;
          ●包含側重表示被包含用例對Actor提供服務的間接性;
          ●擴展側重表示擴展用例的觸發不定性;詳述如下:

 既然用例是系統提供服務的UML表述,那么服務這個過程在所有用例場景中是必然發生的,但發生按照發生條件可分為如下兩種情況:         

⒈無條件發生:肯定發生的;         

⒉有條件發生:未必發生,發生與否取決於系統狀態;

         因此,針對用例的三種關系結合系統狀態考慮,泛化與包含用例屬於無條件發生的用例,而擴展屬於有條件發生的用例。進一步,用例的存在是為Actor提供服 務,但用例提供服務的方式可分為間接和直接兩種,依據於此,泛化中的子用例提供的是直接服務,而包含中的被包含用例提供的是間接服務。同樣,擴展用例提供的也是直接服務,但擴展用例的發生是有條件的。

 另外一點需要提及的是:泛化中的子用例和擴展中的擴展用例均可以作為基本用例事件的備選擇流而存在。

 

備注:默認情況下visio沒有include關系,可以通過一下方式來添加,選擇工具欄uml,再選擇構造型,添加如圖所示的一行,點選確定。此后將可以引用此include關系。

拖一個擴展圖例,然后雙擊,如下圖,構造型中就多出一個list include,選擇include,點選確定。此時右側擴展圖例上的文字將變為include.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM