UML類(lèi)圖

忘記了uml類(lèi)圖連線(xiàn)之間的關(guān)系,記錄一下。

1. 關(guān)聯(lián)關(guān)系

關(guān)聯(lián)(Association)關(guān)系是類(lèi)與類(lèi)之間最常用的一種關(guān)系,它是一種結(jié)構(gòu)化關(guān)系,用于表示一類(lèi)對(duì)象與另一類(lèi)對(duì)象之間有聯(lián)系,如汽車(chē)和輪胎、師傅和徒弟、班級(jí)和學(xué)生等等。在UML類(lèi)圖中,用實(shí)線(xiàn)連接有關(guān)聯(lián)關(guān)系的對(duì)象所對(duì)應(yīng)的類(lèi),在使用Java、C#和C++等編程語(yǔ)言實(shí)現(xiàn)關(guān)聯(lián)關(guān)系時(shí),通常將一個(gè)類(lèi)的對(duì)象作為另一個(gè)類(lèi)的成員變量。在使用類(lèi)圖表示關(guān)聯(lián)關(guān)系時(shí)可以在關(guān)聯(lián)線(xiàn)上標(biāo)注角色名,一般使用一個(gè)表示兩者之間關(guān)系的動(dòng)詞或者名詞表示角色名(有時(shí)該名詞為實(shí)例對(duì)象名),關(guān)系的兩端代表兩種不同的角色,因此在一個(gè)關(guān)聯(lián)關(guān)系中可以包含兩個(gè)角色名,角色名不是必須的,可以根據(jù)需要增加,其目的是使類(lèi)之間的關(guān)系更加明確。

如在一個(gè)登錄界面類(lèi)LoginForm中包含一個(gè)JButton類(lèi)型的注冊(cè)按鈕loginButton,它們之間可以表示為關(guān)聯(lián)關(guān)系,代碼實(shí)現(xiàn)時(shí)可以在LoginForm中定義一個(gè)名為loginButton的屬性對(duì)象,其類(lèi)型為JButton。如圖1所示:

@實(shí)心的箭頭指向被包含的類(lèi):指向成員變量

圖1 關(guān)聯(lián)關(guān)系實(shí)例

圖1對(duì)應(yīng)的Java代碼片段如下:

public class LoginForm {

private JButton loginButton; //定義為成員變量

……

}

public class JButton {

……

}

在UML中,關(guān)聯(lián)關(guān)系通常又包含如下幾種形式:

(1) 雙向關(guān)聯(lián)

默認(rèn)情況下,關(guān)聯(lián)是雙向的。例如:顧客(Customer)購(gòu)買(mǎi)商品(Product)并擁有商品,反之,賣(mài)出的商品總有某個(gè)顧客與之相關(guān)聯(lián)。因此,Customer類(lèi)和Product類(lèi)之間具有雙向關(guān)聯(lián)關(guān)系,如圖2所示:

@實(shí)心直線(xiàn):兩個(gè)有關(guān)系的類(lèi),但是不是包含的關(guān)系

圖2 雙向關(guān)聯(lián)實(shí)例

圖2對(duì)應(yīng)的Java代碼片段如下:

public class Customer {

private Product[] products;

……

}

public class Product {

private Customer customer;

……

}

(2) 單向關(guān)聯(lián)

類(lèi)的關(guān)聯(lián)關(guān)系也可以是單向的,單向關(guān)聯(lián)用帶箭頭的實(shí)線(xiàn)表示。例如:顧客(Customer)擁有地址(Address),則Customer類(lèi)與Address類(lèi)具有單向關(guān)聯(lián)關(guān)系,如圖3所示:

@同第一個(gè):箭頭指向被包含的類(lèi)

圖3 單向關(guān)聯(lián)實(shí)例

圖3對(duì)應(yīng)的Java代碼片段如下:

public class Customer {

private Address address;

……

}

public class Address {

……

}

(3) 自關(guān)聯(lián)

在系統(tǒng)中可能會(huì)存在一些類(lèi)的屬性對(duì)象類(lèi)型為該類(lèi)本身,這種特殊的關(guān)聯(lián)關(guān)系稱(chēng)為自關(guān)聯(lián)。例如:一個(gè)節(jié)點(diǎn)類(lèi)(Node)的成員又是節(jié)點(diǎn)Node類(lèi)型的對(duì)象,如圖4所示:

@比較特殊,自己引用自己

圖4 自關(guān)聯(lián)實(shí)例

圖4對(duì)應(yīng)的Java代碼片段如下:

public class Node {

private Node subNode;

……

}

(4) 多重性關(guān)聯(lián)

多重性關(guān)聯(lián)關(guān)系又稱(chēng)為重?cái)?shù)性(Multiplicity)關(guān)聯(lián)關(guān)系,表示兩個(gè)關(guān)聯(lián)對(duì)象在數(shù)量上的對(duì)應(yīng)關(guān)系。在UML中,對(duì)象之間的多重性可以直接在關(guān)聯(lián)直線(xiàn)上用一個(gè)數(shù)字或一個(gè)數(shù)字范圍表示。

對(duì)象之間可以存在多種多重性關(guān)聯(lián)關(guān)系,常見(jiàn)的多重性表示方式如表1所示:

表1 多重性表示方式列表

表示方式

多重性說(shuō)明

1..1

表示另一個(gè)類(lèi)的一個(gè)對(duì)象只與該類(lèi)的一個(gè)對(duì)象有關(guān)系

0..*

表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)的零個(gè)或多個(gè)對(duì)象有關(guān)系

1..*

表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)的一個(gè)或多個(gè)對(duì)象有關(guān)系

0..1

表示另一個(gè)類(lèi)的一個(gè)對(duì)象沒(méi)有或只與該類(lèi)的一個(gè)對(duì)象有關(guān)系

m..n

表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)最少m,最多n個(gè)對(duì)象有關(guān)系 (m≤n)

例如:一個(gè)界面(Form)可以擁有零個(gè)或多個(gè)按鈕(Button),但是一個(gè)按鈕只能屬于一個(gè)界面,因此,一個(gè)Form類(lèi)的對(duì)象可以與零個(gè)或多個(gè)Button類(lèi)的對(duì)象相關(guān)聯(lián),但一個(gè)Button類(lèi)的對(duì)象只能與一個(gè)Form類(lèi)的對(duì)象關(guān)聯(lián),如圖5所示:

@就是一對(duì)多的關(guān)系

圖5 多重性關(guān)聯(lián)實(shí)例

圖5對(duì)應(yīng)的Java代碼片段如下:

public class Form {

private Button[] buttons; //定義一個(gè)集合對(duì)象

……

}

public class Button {

……

}

(5) 聚合關(guān)系

聚合(Aggregation)關(guān)系表示整體與部分的關(guān)系。在聚合關(guān)系中,成員對(duì)象是整體對(duì)象的一部分,但是成員對(duì)象可以脫離整體對(duì)象獨(dú)立存在。在UML中,聚合關(guān)系用帶空心菱形的直線(xiàn)表示。例如:汽車(chē)發(fā)動(dòng)機(jī)(Engine)是汽車(chē)(Car)的組成部分,但是汽車(chē)發(fā)動(dòng)機(jī)可以獨(dú)立存在,因此,汽車(chē)和發(fā)動(dòng)機(jī)是聚合關(guān)系,如圖6所示:

@左邊是空心菱形,箭頭指向小的一方,左邊由右邊組成,右邊可獨(dú)立存在。

圖6 聚合關(guān)系實(shí)例

在代碼實(shí)現(xiàn)聚合關(guān)系時(shí),成員對(duì)象通常作為構(gòu)造方法、Setter方法或業(yè)務(wù)方法的參數(shù)注入到整體對(duì)象中,圖6對(duì)應(yīng)的Java代碼片段如下:

public class Car {

private Engine engine;

//構(gòu)造注入

public Car(Engine engine) {

this.engine = engine;

}

//設(shè)值注入

public void setEngine(Engine engine) {

this.engine = engine;

}

……

}

public class Engine {

……

}

(6) 組合關(guān)系

組合(Composition)關(guān)系也表示類(lèi)之間整體和部分的關(guān)系,但是在組合關(guān)系中整體對(duì)象可以控制成員對(duì)象的生命周期,一旦整體對(duì)象不存在,成員對(duì)象也將不存在,成員對(duì)象與整體對(duì)象之間具有同生共死的關(guān)系。在UML中,組合關(guān)系用帶實(shí)心菱形的直線(xiàn)表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒(méi)了,嘴巴也就沒(méi)了,因此頭和嘴巴是組合關(guān)系,如圖7所示:

@左邊是實(shí)心菱形,箭頭指向被組合類(lèi),左邊由右邊組成,右邊不可獨(dú)立存在。

圖7 組合關(guān)系實(shí)例

在代碼實(shí)現(xiàn)組合關(guān)系時(shí),通常在整體類(lèi)的構(gòu)造方法中直接實(shí)例化成員類(lèi),圖7對(duì)應(yīng)的Java代碼片段如下:

public class Head {

private Mouth mouth;

public Head() {

mouth = new Mouth(); //實(shí)例化成員類(lèi)

}

……

}

public class Mouth {

……

}

2. 依賴(lài)關(guān)系

依賴(lài)(Dependency)關(guān)系是一種使用關(guān)系,特定事物的改變有可能會(huì)影響到使用該事物的其他事物,在需要表示一個(gè)事物使用另一個(gè)事物時(shí)使用依賴(lài)關(guān)系。大多數(shù)情況下,依賴(lài)關(guān)系體現(xiàn)在某個(gè)類(lèi)的方法使用另一個(gè)類(lèi)的對(duì)象作為參數(shù)。在UML中,依賴(lài)關(guān)系用帶箭頭的虛線(xiàn)表示,由依賴(lài)的一方指向被依賴(lài)的一方。例如:駕駛員開(kāi)車(chē),在Driver類(lèi)的drive()方法中將Car類(lèi)型的對(duì)象car作為一個(gè)參數(shù)傳遞,以便在drive()方法中能夠調(diào)用car的move()方法,且駕駛員的drive()方法依賴(lài)車(chē)的move()方法,因此類(lèi)Driver依賴(lài)類(lèi)Car,如圖1所示:

@左邊類(lèi)依賴(lài)右邊類(lèi)的方法,虛線(xiàn)箭頭指向被依賴(lài)的類(lèi)。

圖1 依賴(lài)關(guān)系實(shí)例

在系統(tǒng)實(shí)施階段,依賴(lài)關(guān)系通常通過(guò)三種方式來(lái)實(shí)現(xiàn),第一種也是最常用的一種方式是如圖1所示的將一個(gè)類(lèi)的對(duì)象作為另一個(gè)類(lèi)中方法的參數(shù),第二種方式是在一個(gè)類(lèi)的方法中將另一個(gè)類(lèi)的對(duì)象作為其局部變量,第三種方式是在一個(gè)類(lèi)的方法中調(diào)用另一個(gè)類(lèi)的靜態(tài)方法。圖1對(duì)應(yīng)的Java代碼片段如下:

public class Driver {

public void drive(Car car) {

car.move();

}

……

}

public class Car {

public void move() {

......

}

……

}

3. 泛化關(guān)系

泛化(Generalization)關(guān)系也就是繼承關(guān)系,用于描述父類(lèi)與子類(lèi)之間的關(guān)系,父類(lèi)又稱(chēng)作基類(lèi)或超類(lèi),子類(lèi)又稱(chēng)作派生類(lèi)。在UML中,泛化關(guān)系用帶空心三角形的直線(xiàn)來(lái)表示。在代碼實(shí)現(xiàn)時(shí),我們使用面向?qū)ο蟮睦^承機(jī)制來(lái)實(shí)現(xiàn)泛化關(guān)系,如在Java語(yǔ)言中使用extends關(guān)鍵字、在C++/C#中使用冒號(hào)“:”來(lái)實(shí)現(xiàn)。例如:Student類(lèi)和Teacher類(lèi)都是Person類(lèi)的子類(lèi),Student類(lèi)和Teacher類(lèi)繼承了Person類(lèi)的屬性和方法,Person類(lèi)的屬性包含姓名(name)和年齡(age),每一個(gè)Student和Teacher也都具有這兩個(gè)屬性,另外Student類(lèi)增加了屬性學(xué)號(hào)(studentNo),Teacher類(lèi)增加了屬性教師編號(hào)(teacherNo),Person類(lèi)的方法包括行走move()和說(shuō)話(huà)say(),Student類(lèi)和Teacher類(lèi)繼承了這兩個(gè)方法,而且Student類(lèi)還新增方法study(),Teacher類(lèi)還新增方法teach()。如圖2所示:

@父類(lèi)和子類(lèi)之間的關(guān)系,實(shí)線(xiàn)空心三角形指向被繼承的類(lèi)

圖2 泛化關(guān)系實(shí)例

圖2對(duì)應(yīng)的Java代碼片段如下:

//父類(lèi)

public class Person {

protected String name;

protected int age;

public void move() {

……

}

public void say() {

……

}

}

//子類(lèi)

public class Student extends Person {

private String studentNo;

public void study() {

……

}

}

//子類(lèi)

public class Teacher extends Person {

private String teacherNo;

public void teach() {

……

}

}

4. 接口與實(shí)現(xiàn)關(guān)系

在很多面向?qū)ο笳Z(yǔ)言中都引入了接口的概念,如Java、C#等,在接口中,通常沒(méi)有屬性,而且所有的操作都是抽象的,只有操作的聲明,沒(méi)有操作的實(shí)現(xiàn)。UML中用與類(lèi)的表示法類(lèi)似的方式表示接口,如圖3所示:

圖3 接口的UML圖示

接口之間也可以有與類(lèi)之間關(guān)系類(lèi)似的繼承關(guān)系和依賴(lài)關(guān)系,但是接口和類(lèi)之間還存在一種實(shí)現(xiàn)(Realization)關(guān)系,在這種關(guān)系中,類(lèi)實(shí)現(xiàn)了接口,類(lèi)中的操作實(shí)現(xiàn)了接口中所聲明的操作。在UML中,類(lèi)與接口之間的實(shí)現(xiàn)關(guān)系用帶空心三角形的虛線(xiàn)來(lái)表示。例如:定義了一個(gè)交通工具接口Vehicle,包含一個(gè)抽象操作move(),在類(lèi)Ship和類(lèi)Car中都實(shí)現(xiàn)了該move()操作,不過(guò)具體的實(shí)現(xiàn)細(xì)節(jié)將會(huì)不一樣,如圖4所示:

@虛線(xiàn),空心三角形指向被實(shí)現(xiàn)的類(lèi),接口

圖4 實(shí)現(xiàn)關(guān)系實(shí)例


實(shí)現(xiàn)關(guān)系在編程實(shí)現(xiàn)時(shí),不同的面向?qū)ο笳Z(yǔ)言也提供了不同的語(yǔ)法,如在Java語(yǔ)言中使用implements關(guān)鍵字,而在C++/C#中使用冒號(hào)“:”來(lái)實(shí)現(xiàn)。圖4對(duì)應(yīng)的Java代碼片段如下:

public interface Vehicle {

public void move();

}

public class Ship implements Vehicle {

public void move() {

……

}

}

public class Car implements Vehicle {

public void move() {

……

}

}

最后總結(jié)一下:

關(guān)聯(lián)關(guān)系

1、雙向關(guān)聯(lián)

2、單項(xiàng)關(guān)聯(lián)

3、自關(guān)聯(lián)

4、多重關(guān)聯(lián)

5、聚合關(guān)系

6、組合關(guān)系

依賴(lài)關(guān)系

泛化關(guān)系

接口與實(shí)現(xiàn)關(guān)系

引入:http://www.uml.org.cn/oobject/201211231.asp,關(guān)系理解,按自己能看的簡(jiǎn)化了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評(píng)論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,413評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,449評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,165評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,559評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,781評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,084評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,278評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,495評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,927評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,172評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,010評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,241評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容

  • 在UML 2.0的13種圖形中,類(lèi)圖是使用頻率最高的UML圖之一。Martin Fowler在其著作《UML Di...
    雷雷_zll閱讀 13,305評(píng)論 0 14
  • 類(lèi)圖 是用于描述系統(tǒng)中所包含的類(lèi)以及它們之間的相互關(guān)系,幫助人們簡(jiǎn)化對(duì)系統(tǒng)的理解,它是系統(tǒng)分析和設(shè)計(jì)階段的重要產(chǎn)物...
    mesen_liu閱讀 12,655評(píng)論 0 7
  • 前言 UML(Unified Modeling Language)中文統(tǒng)一建模語(yǔ)言,是一種開(kāi)放的方法,用于說(shuō)明、可...
    Code4Android閱讀 2,558評(píng)論 4 67
  • UML類(lèi)圖是一種結(jié)構(gòu)圖,用于描述一個(gè)系統(tǒng)的靜態(tài)結(jié)構(gòu)。類(lèi)圖以反映類(lèi)結(jié)構(gòu)和類(lèi)之間關(guān)系為目的,用以描述軟件系統(tǒng)的結(jié)構(gòu),是...
    司馬東陽(yáng)閱讀 2,281評(píng)論 0 1
  • 第一高能反社會(huì)的妖精是誰(shuí)? 大鵬金翅鳥(niǎo)。 他是比《黑暗騎士》中的小丑更強(qiáng)大的一種生物。 別的妖吃人、殺人,總有一定...
    feec2d177229閱讀 674評(píng)論 0 51