在Visio裏,包和類的關係是包含關係,將類拖入包的文件夾以後,關係就創建了,二元關聯符號能夠設置爲:聚合、合成。
接口:空心圓+直線(唐老鴨類實現了‘講人話’);
依賴:虛線+箭頭(動物和空氣的關係);
關聯:實線+箭頭(企鵝須要知道氣候才遷移);
聚合:空心四邊形+實線+箭頭(雁羣和大雁的關係);
合成:實心四邊形+實線+箭頭(鳥和翅膀的關係);
泛化:空心三角形+實線(動物和鳥的繼承關係);
實現:空心三角形+虛線(實現大雁飛翔的接口);
開發Java應用程序時,開發者要想有效地利用統一建模語言(UML),必須全面理解UML元素以及這些元素如何映射到Java。本文重點討論UML類圖中的元素。
類圖是最經常使用的UML圖,它用於描述系統的結構化設計。其中包括類關係以及與每一個類關聯的屬性及行爲。類圖能出色地表示繼承與合成關係。爲了將類圖做爲一 種高效的溝通工具使用,開發者必須理解如何將類圖上出現的元素轉換到Java中。下面來進一步探索這一轉換過程。
元素
在後面的小節中,分別講解了類圖的各個元素及其在Java中相應的表示。我會列出元素名,後續簡短的代碼片段和一幅圖來表示元素在類圖上的樣子。每一節的最後簡要總結了該元素。
類(Class)
類(圖A)是對象的藍圖,其中包含3個組成部分。第一個是Java中定義的類名。第二個是屬性(attributes)。第三個是該類提供的方法。
屬性和操做以前可附加一個可見性修飾符。加號(+)表示具備公共可見性。減號(-)表示私有可見性。#號表示受保護的可見性。省略這些修飾符表示具備 package(包)級別的可見性。若是屬性或操做具備下劃線,代表它是靜態的。在操做中,可同時列出它接受的參數,以及返回類型,如圖A的「Java」 區域所示。
圖A
C#:
第一行:類名,若是是抽象類,則用斜體顯示.
第二行:字段或屬性.
第三行:類的操做(方法或者行爲).
+ :表示public; - :表示:private; #:表示protected;
包(Package)
包(圖B) 是一種常規用途的組合機制。UML中的一個包直接對應於Java中的一個包。在Java中,一個包可能含有其餘包、類或者同時含有這二者。進行建模時,你 一般擁有邏輯性的包,它主要用於對你的模型進行組織。你還會擁有物理性的包,它直接轉換成系統中的Java包。每一個包的名稱對這個包進行了唯一性的標識。
圖B
接口(Interface)
接口(圖C)是一系列操做的集合,它指定了一個類所提供的服務。它直接對應於Java中的一個接口類型。接口既可用圖C的那個圖標來表示,也可由附加了<<interface>>的一個標準類來表示。一般,根據接口在類圖上的樣子,就能知道與其餘類的關係。
圖C
C#:
它表示一個接口圖,與類圖的區別主要是頂端有<<interface>>顯示。第一行是接口名稱,第二行是接口方法。接口還有另外一種表示方法,俗稱棒棒糖表示法,就是唐老鴨類實現了‘講人話’的接口。」
關係
後面的例子將針對某個具體目的來獨立地展現各類關係。雖然語法無誤,但這些例子可進一步精煉,在它們的有效範圍內包括更多的語義。
依賴(Dependency)
實體之間一個「使用」關係暗示一個實體的規範發生變化後,可能影響依賴於它的其餘實例(圖D)。 更具體地說,它可轉換爲對不在實例做用域內的一個類或對象的任何類型的引用。其中包括一個局部變量,對經過方法調用而得到的一個對象的引用(以下例所 示),或者對一個類的靜態方法的引用(同時不存在那個類的一個實例)。也可利用「依賴」來表示包和包之間的關係。因爲包中含有類,因此你可根據那些包中的 各個類之間的關係,表示出包和包的關係。
圖D
「動物幾大特徵,好比有新陳代謝,能繁殖。而動物要有生命力,須要氧氣、水以及食物等。也就是說,動物依賴於氧氣和水。他們之間是依賴關係(Dependency),用虛線箭頭來表示。」
abstract class Animal
{
public Metabolism (Oxygen oxygen,Water water)
{
}
}
關聯(Association)
實體之間的一個結構化關係代表對象是相互鏈接的。箭頭是可選的,它用於指定導航能力。若是沒有箭頭,暗示是一種雙向的導航能力。在Java中,關聯(圖E) 轉換爲一個實例做用域的變量,就像圖E的「Java」區域所展現的代碼那樣。可爲一個關聯附加其餘修飾符。多重性(Multiplicity)修飾符暗示 着實例之間的關係。在示範代碼中,Employee能夠有0個或更多的TimeCard對象。可是,每一個TimeCard只從屬於單獨一個 Employee。
圖E
大 鳥:「你看企鵝和睦候兩個類,企鵝是很特別的鳥,會遊不會飛。更重要的是,它與氣候有很大的關聯。咱們不去討論爲何北極沒有企鵝,爲何它們要每一年長途 跋涉。總之,企鵝須要‘知道’氣候的變化,須要‘瞭解’氣候規律。當一個類‘知道’另外一個類時,能夠用關聯(association)。關聯關係用實線箭 頭來表示。」
class Penguin : Bird
{
private Climate climate;
聚合(Aggregation)
聚合(圖F)是關聯的一種形式,表明兩個類之間的總體/局部關係。聚合暗示着總體在概念上處於比局部更高的一個級別,而關聯暗示兩個類在概念上位於相同的級別。聚合也轉換成Java中的一個實例做用域變量。
關聯和聚合的區別純粹是概念上的,並且嚴格反映在語義上。聚合還暗示着實例圖中不存在迴路。換言之,只能是一種單向關係。
圖F
大 鳥:「咱們再來看大雁與雁羣這兩個類,大雁是羣居動物,每隻大雁都是屬於一個雁羣,一個雁羣能夠有多隻大雁。因此它們之間就知足聚合 (Aggregation)關係。聚合表示一種弱的‘擁有’關係,體現的是A對象能夠包含B對象,但B對象不是A對象的一部分[DPE](DPE表示此句 摘自《設計模式》(第2版),詳細摘要說明見附錄二)。聚合關係用空心的菱形+實線箭頭來表示。」
class WideGooseAggregate
{
private WideGoose[] arrayWideGoose;
}
合成(Composition)
合成 (圖G) 是聚合的一種特殊形式,暗示「局部」在「總體」內部的生存期職責。合成也是非共享的。因此,雖然局部不必定要隨總體的銷燬而被銷燬,但總體要麼負責保持局 部的存活狀態,要麼負責將其銷燬。局部不可與其餘總體共享。可是,總體可將全部權轉交給另外一個對象,後者隨即將承擔生存期職責。
Employee和TimeCard的關係或許更適合表示成「合成」,而不是表示成「關聯」。
圖G
大 鳥:「合成(Composition,也有翻譯成‘組合’的)是一種強的‘擁有’關係,體現了嚴格的部分和總體的關係,部分和總體的生命週期同樣 [DPE]。在這裏鳥和其翅膀就是合成(組合)關係,由於它們是部分和總體的關係,而且翅膀和鳥的生命週期是相同的。合成關係用實心的菱形+實線箭頭來表 示。另外,你會注意到合成關係的連線兩端還有一個數字‘1’和數字‘2’,這被稱爲基數。代表這一端的類能夠有幾個實例,很顯然,一個鳥應該有兩隻翅膀。 若是一個類可能有無數個實例,則就用‘n’來表示。關聯關係、聚合關係也能夠有基數的。」
class Bird
{
private Wing wing;
public Bird()
{
wing = new Wing();
}
}
泛化(Generalization)
泛化(圖H)表示一個更泛化的元素和一個更具體的元素之間的關係。泛化是用於對繼承進行建模的UML元素。在Java中,用extends關鍵字來直接表示這種關係。
圖H
大鳥:「接下來就可講類與類,類與接口之間的關係了。你可首先注意動物、鳥、鴨、唐老鴨之間關係符號。」
小菜:「明白了,它們都是繼承的關係,繼承關係用空心三角形+實線來表示。」
實現(Realization)
實例(圖I)關係指定兩個實體之間的一個合同。換言之,一個實體定義一個合同,而另外一個實體保證履行該合同。對Java應用程序進行建模時,實現關係可直接用implements關鍵字來表示。
圖I
大鳥:「我舉的幾種鳥中,大雁是最能飛的,我讓它實現了飛翔接口。實現接口用空心三角形+虛線來表示。」
|
|
|
|
|
|
class WideGoose : IFly
{
}
|
|
|
|
精確映射
如本文所述,UML類圖上的元素能精確映射到Java編程語言。開發團隊的成員可利用這種精確性來增強溝通,取得對系統結構化設計的共識。