(转载)依赖、关联、聚合、组合
?
?
?一、依賴(lài)關(guān)系(Dependence)
?
依賴(lài)關(guān)系(Dependence):假設(shè)A類(lèi)的變化引起了B類(lèi)的變化,則說(shuō)名B類(lèi)依賴(lài)于A類(lèi)。
?
? ?依賴(lài)關(guān)系(Dependency)?是一種使用關(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)系用帶箭頭的虛線表示,由依賴(lài)的一方指向被依賴(lài)的一方。?
依賴(lài)關(guān)系有如下三種情況:
1、A類(lèi)是B類(lèi)中的(某中方法的)局部變量;
2、A類(lèi)是B類(lèi)方法當(dāng)中的一個(gè)參數(shù);
3、A類(lèi)向B類(lèi)發(fā)送消息,從而影響B(tài)類(lèi)發(fā)生變化;
?
?
?二、泛化關(guān)系(Generalization)
?
泛化關(guān)系(Generalization):A是B和C的父類(lèi),B,C具有公共類(lèi)(父類(lèi))A,說(shuō)明A是B,C的一般化(概括,也稱(chēng)泛化)
?
? ?泛化關(guān)系(Generalization)也就是繼承關(guān)系,也稱(chēng)為“is-a-kind-of”關(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)系用帶空心三角形的直線來(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)。??
?
?
?
在UML當(dāng)中,對(duì)泛化關(guān)系有三個(gè)要求:
1、子類(lèi)與父類(lèi)應(yīng)該完全一致,父類(lèi)所具有的屬性、操作,子類(lèi)應(yīng)該都有;
2、子類(lèi)中除了與父類(lèi)一致的信息以外,還包括額外的信息;
3、可以使用父類(lèi)的實(shí)例的地方,也可以使用子類(lèi)的實(shí)例;
?
?三、關(guān)聯(lián)關(guān)系(Association)
?
關(guān)聯(lián)關(guān)系(Association):類(lèi)之間的聯(lián)系,如客戶和訂單,每個(gè)訂單對(duì)應(yīng)特定的客戶,每個(gè)客戶對(duì)應(yīng)一些特定的訂單,再如籃球隊(duì)員與球隊(duì)之間的關(guān)聯(lián)(下圖所示)。
?
其中,關(guān)聯(lián)兩邊的”employee”和“employer”標(biāo)示了兩者之間的關(guān)系,而數(shù)字表示兩者的關(guān)系的限制,是關(guān)聯(lián)兩者之間的多重性。通常有“*”(表示所有,不限),“1”(表示有且僅有一個(gè)),“0…”(表示0個(gè)或者多個(gè)),“0,1”(表示0個(gè)或者一個(gè)),“n…m”(表示n到m個(gè)都可以),“m…*”(表示至少m個(gè))。 ? ?關(guān)聯(lián)關(guān)系(Association)?是類(lèi)與類(lèi)之間最常用的一種關(guān)系,它是一種結(jié)構(gòu)化關(guān)系,用于表示一類(lèi)對(duì)象與另一類(lèi)對(duì)象之間有聯(lián)系。 ? ?在UML類(lèi)圖中,用實(shí)線連接有關(guān)聯(liá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)線上標(biāo)注角色名。 1) ?雙向關(guān)聯(lián):?默認(rèn)情況下,關(guān)聯(lián)是雙向的。?
?
?
2 )?單向關(guān)聯(lián):類(lèi)的關(guān)聯(lián)關(guān)系也可以是單向的,單向關(guān)聯(lián)用帶箭頭的實(shí)線表示.4)?重?cái)?shù)性關(guān)聯(lián):?重?cái)?shù)性關(guān)聯(lián)關(guān)系又稱(chēng)為多重性關(guān)聯(lián)關(guān)系(Multiplicity),表示一個(gè)類(lèi)的對(duì)象與另一個(gè)類(lèi)的對(duì)象連接的個(gè)數(shù)。在UML中多重性關(guān)系可以直接在關(guān)聯(lián)直線上增加一個(gè)數(shù)字表示與之對(duì)應(yīng)的另一個(gè)類(lèi)的對(duì)象的個(gè)數(shù)。
| 表示方式 | 多重性說(shuō)明 |
| 1..1 | 表示另一個(gè)類(lèi)的一個(gè)對(duì)象只與一個(gè)該類(lèi)對(duì)象有關(guān)系 |
| 0..* | 表示另一個(gè)類(lèi)的一個(gè)對(duì)象與零個(gè)或多個(gè)該類(lèi)對(duì)象有關(guān)系 |
| 1..* | 表示另一個(gè)類(lèi)的一個(gè)對(duì)象與一個(gè)或多個(gè)該類(lèi)對(duì)象有關(guān)系 |
| 0..1 | 表示另一個(gè)類(lèi)的一個(gè)對(duì)象沒(méi)有或只與一個(gè)該類(lèi)對(duì)象有關(guān)系 |
| m..n | 表示另一個(gè)類(lèi)的一個(gè)對(duì)象與最少m、最多n個(gè)該類(lèi)對(duì)象有關(guān)系 (m<=n) |
?
?
?四、聚合關(guān)系(Aggregation)
?
聚合關(guān)系(Aggregation):表示的是整體和部分的關(guān)系,整體與部分?可以分開(kāi).
?
? ?聚合關(guān)系(Aggregation)?表示一個(gè)整體與部分的關(guān)系。通常在定義一個(gè)整體類(lèi)后,再去分析這個(gè)整體類(lèi)的組成結(jié)構(gòu),從而找出一些成員類(lèi),該整體類(lèi)和成員類(lèi)之間就形成了聚合 ? 關(guān)系。 ? ?在聚合關(guān)系中,成員類(lèi)是整體類(lèi)的一部分,即成員對(duì)象是整體對(duì)象的一部分,但是成員對(duì)象可以脫離整體對(duì)象獨(dú)立存在。在UML中,聚合關(guān)系用帶空心菱形的直線表示。??
?
?
如:電話機(jī)包括一個(gè)話筒
???????電腦包括鍵盤(pán)、顯示器,一臺(tái)電腦可以和多個(gè)鍵盤(pán)、多個(gè)顯示器搭配,確定鍵盤(pán)和顯示器是可以和主機(jī)分開(kāi)的,主機(jī)可以選擇其他的鍵盤(pán)、顯示器組成電腦;
?五、組合關(guān)系(Composition)
組合關(guān)系(Composition):也是整體與部分的關(guān)系,但是整體與部分不可以分開(kāi).
?
? ?組合關(guān)系(Composition)也表示類(lèi)之間整體和部分的關(guān)系,但是組合關(guān)系中部分和整體具有統(tǒng)一的生存期。一旦整體對(duì)象不存在,部分對(duì)象也將不存在,部分對(duì)象與整體對(duì)象之 ? ?間具有同生共死的關(guān)系。 ? ?在組合關(guān)系中,成員類(lèi)是整體類(lèi)的一部分,而且整體類(lèi)可以控制成員類(lèi)的生命周期,即成員類(lèi)的存在依賴(lài)于整體類(lèi)。在UML中,組合關(guān)系用帶實(shí)心菱形的直線表示。?
?
?
如:公司和部門(mén),部門(mén)是部分,公司是整體,公司A的財(cái)務(wù)部不可能和公司B的財(cái)務(wù)部對(duì)換,就是說(shuō),公司A不能和自己的財(cái)務(wù)部分開(kāi);?人與人的心臟.
?
?六、實(shí)現(xiàn)關(guān)系(Implementation)
?
實(shí)現(xiàn)關(guān)系(Implementation):是用來(lái)規(guī)定接口和實(shí)線接口的類(lèi)或者構(gòu)建結(jié)構(gòu)的關(guān)系,接口是操作的集合,而這些操作就用于規(guī)定類(lèi)或者構(gòu)建的一種服務(wù)。
?
??接口之間也可以有與類(lèi)之間關(guān)系類(lèi)似的繼承關(guān)系和依賴(lài)關(guān)系,但是接口和類(lèi)之間還存在一種實(shí)現(xiàn)關(guān)系(Realization),在這種關(guān)系中,類(lèi)實(shí)現(xiàn)了接口,類(lèi)中的操作實(shí)現(xiàn)了接口中所 ? ? 聲明的操作。在UML中,類(lèi)與接口之間的實(shí)現(xiàn)關(guān)系用帶空心三角形的虛線來(lái)表示。UML的9中圖例概述
?
作為一種建模語(yǔ)言,UML的定義包括UML語(yǔ)義和UML表示法兩個(gè)部分。
l UML語(yǔ)義:描述基于UML的精確元模型定義。
l UML表示法:定義UML符號(hào)的表示法,為開(kāi)發(fā)者或開(kāi)發(fā)工具使用這些圖形符號(hào)和文本語(yǔ)法為系統(tǒng)建模提供了標(biāo)準(zhǔn)。這些圖形符號(hào)和文字所表達(dá)的是應(yīng)用級(jí)的模型,在語(yǔ)義上它是UML元模型的實(shí)例。
標(biāo)準(zhǔn)建模語(yǔ)言UML可以由下列5類(lèi)圖來(lái)定義。
l 用例圖:從用戶角度描述系統(tǒng)功能,并指出各功能的操作者。
l?靜態(tài)圖:包括類(lèi)圖和對(duì)象圖。類(lèi)圖描述系統(tǒng)中類(lèi)的靜態(tài)結(jié)構(gòu),不僅定義系統(tǒng)中的類(lèi),表示類(lèi)之間的聯(lián)系,如關(guān)聯(lián)、依賴(lài)、聚合等,也包括類(lèi)的屬性和操作,類(lèi)圖描述的是一種靜態(tài)關(guān)系,在系統(tǒng)的整個(gè)生命周期都是有效的。對(duì)象圖是類(lèi)圖的實(shí)例,幾乎使用與類(lèi)圖完全相同的標(biāo)識(shí)。一個(gè)對(duì)象圖是類(lèi)圖的一個(gè)實(shí)例。由于對(duì)象存在生命周期,因此對(duì)象圖只能在系統(tǒng)某一時(shí)間段存在。
l 行為圖:描述系統(tǒng)的動(dòng)態(tài)模型和組成對(duì)象間的交互關(guān)系,包括狀態(tài)圖和活動(dòng)圖。狀態(tài)圖描述類(lèi)的對(duì)象所有可能的狀態(tài)以及事件發(fā)生時(shí)狀態(tài)的轉(zhuǎn)移條件,狀態(tài)圖是對(duì)類(lèi)圖的補(bǔ)充,活動(dòng)圖描述滿足用例要求所要進(jìn)行的活動(dòng)以及活動(dòng)間的約束關(guān)系,有利于識(shí)別并進(jìn)行活動(dòng)。
l 交互圖:描述對(duì)象間的交互關(guān)系,包括時(shí)序圖和協(xié)作圖。時(shí)序圖顯示對(duì)象之間的動(dòng)態(tài)合作關(guān)系,它強(qiáng)調(diào)對(duì)象之間消息發(fā)送的順序,同時(shí)顯示對(duì)象之間的交互;協(xié)作圖描述對(duì)象間的協(xié)作關(guān)系,協(xié)作圖跟時(shí)序圖相似,顯示對(duì)象間的動(dòng)態(tài)合作關(guān)系。除顯示信息交換外,協(xié)作圖還顯示對(duì)象以及它們之間的關(guān)系。如果強(qiáng)調(diào)時(shí)間和順序,則使用時(shí)序圖;如果強(qiáng)調(diào)上下級(jí)關(guān)系,則選擇協(xié)作圖。
l 實(shí)現(xiàn)圖:包括組件圖和部署圖。組件圖描述代碼部件的物理結(jié)構(gòu)及各部件之間的依賴(lài)關(guān)系,組件圖有助于分析和理解部件之間的相互影響程度;部署圖定義系統(tǒng)中軟硬件的物理體系結(jié)構(gòu)。
采用UML來(lái)設(shè)計(jì)系統(tǒng)時(shí),第一步是描述需求;第二步根據(jù)需求建立系統(tǒng)的靜態(tài)模型,以構(gòu)造系統(tǒng)的結(jié)構(gòu);第三步是描述系統(tǒng)的行為。其中在第一步與第二步中所建立的模型都是靜態(tài)的,包括用例圖、類(lèi)圖、對(duì)象圖、組件圖和部署圖等5種圖形,是標(biāo)準(zhǔn)建模語(yǔ)言UML的靜態(tài)建模機(jī)制。其中第三步中所建立的模型或者可以執(zhí)行,或者表示執(zhí)行時(shí)的時(shí)序狀態(tài)或交互關(guān)系。它包括狀態(tài)圖、活動(dòng)圖、時(shí)序圖和協(xié)作圖等4種圖形,是標(biāo)準(zhǔn)建模語(yǔ)言UML的動(dòng)態(tài)建模機(jī)制。
?
首先對(duì)UML中的各個(gè)圖的功用做一個(gè)簡(jiǎn)單介紹:
1、用例圖 描述角色以及角色與用例之間的連接關(guān)系。說(shuō)明的是誰(shuí)要使用系統(tǒng),以及他們使用該系統(tǒng)可以做些什么。一個(gè)用例圖包含了多個(gè)模型元素,如系統(tǒng)、參與者和用例,并且顯示了這些元素之間的各種關(guān)系,如泛化、關(guān)聯(lián)和依賴(lài)。 2、類(lèi)圖 類(lèi)圖是描述系統(tǒng)中的類(lèi),以及各個(gè)類(lèi)之間的關(guān)系的靜態(tài)視圖。能夠讓我們?cè)谡_編寫(xiě)代碼以前對(duì)系統(tǒng)有一個(gè)全面的認(rèn)識(shí)。類(lèi)圖是一種模型類(lèi)型,確切的說(shuō),是一種靜態(tài)模型類(lèi)型。 3、對(duì)象圖 與類(lèi)圖極為相似,它是類(lèi)圖的實(shí)例,對(duì)象圖顯示類(lèi)的多個(gè)對(duì)象實(shí)例,而不是實(shí)際的類(lèi)。它描述的不是類(lèi)之間的關(guān)系,而是對(duì)象之間的關(guān)系。 4、活動(dòng)圖 描述用例要求所要進(jìn)行的活動(dòng),以及活動(dòng)間的約束關(guān)系,有利于識(shí)別并行活動(dòng)。能夠演示出系統(tǒng)中哪些地方存在功能,以及這些功能和系統(tǒng)中其他組件的功能如何共同滿足前面使用用例圖建模的商務(wù)需求。 5、狀態(tài)圖 描述類(lèi)的對(duì)象所有可能的狀態(tài),以及事件發(fā)生時(shí)狀態(tài)的轉(zhuǎn)移條件。可以捕獲對(duì)象、子系統(tǒng)和系統(tǒng)的生命周期。他們可以告知一個(gè)對(duì)象可以擁有的狀態(tài),并且事件(如消息的接收、時(shí)間的流逝、錯(cuò)誤、條件變?yōu)檎娴?會(huì)怎么隨著時(shí)間的推移來(lái)影響這些狀態(tài)。一個(gè)狀態(tài)圖應(yīng)該連接到所有具有清晰的可標(biāo)識(shí)狀態(tài)和復(fù)雜行為的類(lèi);該圖可以確定類(lèi)的行為,以及該行為如何根據(jù)當(dāng)前的狀態(tài)變化,也可以展示哪些事件將會(huì)改變類(lèi)的對(duì)象的狀態(tài)。狀態(tài)圖是對(duì)類(lèi)圖的補(bǔ)充。 6、序列圖(順序圖) 序列圖是用來(lái)顯示你的參與者如何以一系列順序的步驟與系統(tǒng)的對(duì)象交互的模型。順序圖可以用來(lái)展示對(duì)象之間是如何進(jìn)行交互的。順序圖將顯示的重點(diǎn)放在消息序列上,即強(qiáng)調(diào)消息是如何在對(duì)象之間被發(fā)送和接收的。 7、協(xié)作圖??? 和序列圖相似,顯示對(duì)象間的動(dòng)態(tài)合作關(guān)系。可以看成是類(lèi)圖和順序圖的交集,協(xié)作圖建模對(duì)象或者角色,以及它們彼此之間是如何通信的。如果強(qiáng)調(diào)時(shí)間和順序,則使用序列圖;如果強(qiáng)調(diào)上下級(jí)關(guān)系,則選擇協(xié)作圖;這兩種圖合稱(chēng)為交互圖。
8、構(gòu)件圖?(組件圖) 描述代碼構(gòu)件的物理結(jié)構(gòu)以及各種構(gòu)建之間的依賴(lài)關(guān)系。用來(lái)建模軟件的組件及其相互之間的關(guān)系,這些圖由構(gòu)件標(biāo)記符和構(gòu)件之間的關(guān)系構(gòu)成。在組件圖中,構(gòu)件時(shí)軟件單個(gè)組成部分,它可以是一個(gè)文件,產(chǎn)品、可執(zhí)行文件和腳本等。 9、部署圖?(配置圖) 是用來(lái)建模系統(tǒng)的物理部署。例如計(jì)算機(jī)和設(shè)備,以及它們之間是如何連接的。部署圖的使用者是開(kāi)發(fā)人員、系統(tǒng)集成人員和測(cè)試人員。 幾種圖的區(qū)別:一:這九種模型圖各有側(cè)重,
1:用例圖側(cè)重描述用戶需求,
2:類(lèi)圖側(cè)重描述系統(tǒng)具體實(shí)現(xiàn);
二:描述的方面都不相同,
1:類(lèi)圖描述的是系統(tǒng)的結(jié)構(gòu),
2:序列圖描述的是系統(tǒng)的行為;
三:抽象的層次也不同,
1:構(gòu)件圖描述系統(tǒng)的模塊結(jié)構(gòu),抽象層次較高,
2:類(lèi)圖是描述具體模塊的結(jié)構(gòu),抽象層次一般,
3:對(duì)象圖描述了具體的模塊實(shí)現(xiàn),抽象層次較低。
?
在有的文獻(xiàn)書(shū)籍中,將這九種模型圖分為三大類(lèi):
結(jié)構(gòu)分類(lèi)、動(dòng)態(tài)行為和模型管理:
1:結(jié)構(gòu)分類(lèi)包括用例圖、類(lèi)圖、對(duì)象圖、構(gòu)件圖和部署圖,
2:動(dòng)態(tài)行為包括狀態(tài)圖、活動(dòng)圖、順序圖和協(xié)作圖,
3:模型管理則包含類(lèi)圖。
?
?
畫(huà)圖說(shuō)明
UML(統(tǒng)一建模語(yǔ)言):是面向?qū)ο蟮目梢暬5囊环N語(yǔ)言。是數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中,在E-R圖(實(shí)體-聯(lián)系圖)的設(shè)計(jì)后的進(jìn)一步建模。UML中有3種構(gòu)造塊:事物、關(guān)系和圖,事物是對(duì)模型中最具有代表性的成分的抽象;關(guān)系是把事物結(jié)合在一起;圖聚集了相關(guān)的的事物。具體關(guān)系圖標(biāo)如下:
說(shuō)明:
構(gòu)件事物是名詞,是模型的靜態(tài)部分。
行為事物是動(dòng)態(tài)部分,表示行為。
分組事物是組織部分。
注釋事物是解釋部分。 依賴(lài):一個(gè)事物變化會(huì)引起另一個(gè)事物變化。
聚集:特殊的關(guān)聯(lián),描述整體與部分的組合關(guān)系。
泛化:是一種特殊與一般的關(guān)系,如子元素(特殊)與父元素(一般),箭頭指向父元素。
實(shí)現(xiàn):類(lèi)元之間的關(guān)系,其中一個(gè)類(lèi)元指定了由另一個(gè)類(lèi)元保證執(zhí)行的契約。一般用在接口和實(shí)現(xiàn)他們的類(lèi)之間或用例和實(shí)現(xiàn)它們的協(xié)作之間。 UML提供9種視圖:類(lèi)圖、對(duì)象圖,用例圖,序列圖、協(xié)作圖,狀態(tài)圖、活動(dòng)圖,構(gòu)件圖和部署圖。
在UML系統(tǒng)開(kāi)發(fā)中有三個(gè)主要的模型: 功能模型: 從用戶的角度展示系統(tǒng)的功能,包括用例圖。
對(duì)象模型: 采用對(duì)象,屬性,操作,關(guān)聯(lián)等概念展示系統(tǒng)的結(jié)構(gòu)和基礎(chǔ),包括類(lèi)圖。
動(dòng)態(tài)模型: 展現(xiàn)系統(tǒng)的內(nèi)部行為。 包括序列圖,活動(dòng)圖,狀態(tài)圖。
下面具體說(shuō)明:
1.類(lèi)圖:描述一組對(duì)象、接口、協(xié)作等事物之間的關(guān)系。如下圖(摘自網(wǎng)絡(luò)): 注:#表示protected,+表示Public,-表示private
2.對(duì)象圖:描述一組對(duì)象之間的關(guān)系,是具有具體屬性值和行為的一個(gè)具體事物,其是類(lèi)圖中所建事物實(shí)例的靜態(tài)快照,其與類(lèi)圖的主要區(qū)別是一個(gè)是抽象的,而對(duì)象圖是具體的。如下圖(摘自網(wǎng)絡(luò)):
3.用例圖:描述一組用例、參與者以及它們之間的關(guān)系,其展示的是該系統(tǒng)在它的外面環(huán)境中所提供的外部可見(jiàn)服務(wù)。如下圖(摘自網(wǎng)絡(luò)):
4.交互圖:包括序列圖(順序圖)和協(xié)作圖,兩者對(duì)應(yīng),順序圖是強(qiáng)調(diào)消息時(shí)間順序,有對(duì)象生命線和控制焦點(diǎn)。協(xié)作圖是強(qiáng)調(diào)接收和發(fā)送消息的對(duì)象的結(jié)構(gòu)組織,有路徑和順序號(hào)。如下圖(摘自網(wǎng)絡(luò)): 序列圖: 協(xié)作圖:
5.狀態(tài)圖:展示了一個(gè)狀態(tài)機(jī),由狀態(tài)、轉(zhuǎn)換、事件和活動(dòng)組成。強(qiáng)調(diào)事件行為的順序。如下圖(摘自網(wǎng)絡(luò)): 6.活動(dòng)圖:是一種特殊的狀態(tài)圖,實(shí)現(xiàn)一個(gè)活動(dòng)到另一個(gè)活動(dòng)的流程。如下圖(摘自網(wǎng)絡(luò)): 7.構(gòu)件圖和部署圖:構(gòu)件圖展示一組構(gòu)件之間的組織和依賴(lài)關(guān)系,并以全局的模型展示出來(lái)。部署圖是構(gòu)件的配置及描述系統(tǒng)如何在硬件上部署。如下圖(摘自網(wǎng)絡(luò)):
?
?
?
UML中的幾種關(guān)系詳細(xì)解析
?
在UML類(lèi)圖中,常見(jiàn)的有以下幾種關(guān)系:?泛化(Generalization),??實(shí)現(xiàn)(Realization),關(guān)聯(lián)(Association),聚合(Aggregation),組合(Composition),依賴(lài)(Dependency)
? 1.?泛化(Generalization)
【泛化關(guān)系】:是一種繼承關(guān)系,表示一般與特殊的關(guān)系,它指定了子類(lèi)如何特化父類(lèi)的所有特征和行為。例如:老虎是動(dòng)物的一種,即有老虎的特性也有動(dòng)物的共性。
【箭頭指向】:帶三角箭頭的實(shí)線,箭頭指向父類(lèi)
?
2.?實(shí)現(xiàn)(Realization)
【實(shí)現(xiàn)關(guān)系】:是一種類(lèi)與接口的關(guān)系,表示類(lèi)是接口所有特征和行為的實(shí)現(xiàn).
【箭頭指向】:帶三角箭頭的虛線,箭頭指向接口
?
3.?關(guān)聯(lián)(Association)
【關(guān)聯(lián)關(guān)系】:是一種擁有的關(guān)系,它使一個(gè)類(lèi)知道另一個(gè)類(lèi)的屬性和方法;如:老師與學(xué)生,丈夫與妻子關(guān)聯(lián)可以是雙向的,也可以是單向的。雙向的關(guān)聯(lián)可以有兩個(gè)箭頭或者沒(méi)有箭頭,單向的關(guān)聯(lián)有一個(gè)箭頭。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶普通箭頭的實(shí)心線,指向被擁有者
?
上圖中,老師與學(xué)生是雙向關(guān)聯(lián),老師有多名學(xué)生,學(xué)生也可能有多名老師。但學(xué)生與某課程間的關(guān)系為單向關(guān)聯(lián),一名學(xué)生可能要上多門(mén)課程,課程是個(gè)抽象的東西他不擁有學(xué)生。?
下圖為自身關(guān)聯(lián):?
4.?聚合(Aggregation)
【聚合關(guān)系】:是整體與部分的關(guān)系,且部分可以離開(kāi)整體而單獨(dú)存在。如車(chē)和輪胎是整體和部分的關(guān)系,輪胎離開(kāi)車(chē)仍然可以存在。
聚合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系;關(guān)聯(lián)和聚合在語(yǔ)法上無(wú)法區(qū)分,必須考察具體的邏輯關(guān)系。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶空心菱形的實(shí)心線,菱形指向整體
?
5.?組合(Composition)
【組合關(guān)系】:是整體與部分的關(guān)系,但部分不能離開(kāi)整體而單獨(dú)存在。如公司和部門(mén)是整體和部分的關(guān)系,沒(méi)有公司就不存在部門(mén)。
???????組合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系還要強(qiáng)的關(guān)系,它要求普通的聚合關(guān)系中代表整體的對(duì)象負(fù)責(zé)代表部分的對(duì)象的生命周期。
【代碼體現(xiàn)】:成員變量
【箭頭及指向】:帶實(shí)心菱形的實(shí)線,菱形指向整體
6.?依賴(lài)(Dependency)
【依賴(lài)關(guān)系】:是一種使用的關(guān)系,即一個(gè)類(lèi)的實(shí)現(xiàn)需要另一個(gè)類(lèi)的協(xié)助,所以要盡量不使用雙向的互相依賴(lài).
【代碼表現(xiàn)】:局部變量、方法的參數(shù)或者對(duì)靜態(tài)方法的調(diào)用
【箭頭及指向】:帶箭頭的虛線,指向被使用者
?
各種關(guān)系的強(qiáng)弱順序:
泛化?=?實(shí)現(xiàn)?>?組合?>?聚合?>?關(guān)聯(lián)?>?依賴(lài)?
下面這張UML圖,比較形象地展示了各種類(lèi)圖關(guān)系:
?
?
UML幾種圖介紹
?
?
用例圖
用例圖描述了系統(tǒng)提供的一個(gè)功能單元。用例圖的主要目的是幫助開(kāi)發(fā)團(tuán)隊(duì)以一種可視化的方式理解系統(tǒng)的功能需求,包括基于基本流程的”角色”(actors,也就是與系統(tǒng)交互的其他實(shí)體)關(guān)系,以及系統(tǒng)內(nèi)用例之間的關(guān)系。用例圖一般表示出用例的組織關(guān)系 —— 要么是整個(gè)系統(tǒng)的全部用例,要么是完成具有功能(例如,所有安全管理相關(guān)的用例)的一組用例。要在用例圖上顯示某個(gè)用例,可繪制一個(gè)橢圓,然后將用例的名稱(chēng)放在橢圓的中心或橢圓下面的中間位置。要在用例圖上繪制一個(gè)角色(表示一個(gè)系統(tǒng)用戶),可繪制一個(gè)人形符號(hào)。角色和用例之間的關(guān)系使用簡(jiǎn)單的線段來(lái)描述,如圖1所示。
?
圖1:示例用例圖
圖字(從上到下):CD銷(xiāo)售系統(tǒng);查看樂(lè)隊(duì)CD的銷(xiāo)售統(tǒng)計(jì);樂(lè)隊(duì)經(jīng)理;查看Billboard 200排行榜報(bào)告;唱片經(jīng)理;查看特定CD的銷(xiāo)售統(tǒng)計(jì);檢索最新的Billboard 200排行榜報(bào)告;排行榜報(bào)告服務(wù)
用例圖通常用于表達(dá)系統(tǒng)或者系統(tǒng)范疇的高級(jí)功能。如圖1所示,可以很容易看出該系統(tǒng)所提供的功能。這個(gè)系統(tǒng)允許樂(lè)隊(duì)經(jīng)理查看樂(lè)隊(duì)CD的銷(xiāo)售統(tǒng)計(jì)報(bào)告以及Billboard 200排行榜報(bào)告。它也允許唱片經(jīng)理查看特定CD的銷(xiāo)售統(tǒng)計(jì)報(bào)告和這些CD在Billboard 200排行榜的報(bào)告。這個(gè)圖還告訴我們,系統(tǒng)將通過(guò)一個(gè)名為”排行榜報(bào)告服務(wù)”的外部系統(tǒng)提供Billboard排行榜報(bào)告。
此外,在用例圖中,沒(méi)有列出的用例表明了該系統(tǒng)不能完成的功能。例如,它不能提供給樂(lè)隊(duì)經(jīng)理收聽(tīng)Billboard 200上不同專(zhuān)輯中的歌曲的途徑 —— 也就是說(shuō),系統(tǒng)沒(méi)有引用一個(gè)叫做”收聽(tīng)Billboard 200上的歌曲”的用例。這種缺少不是一件小事。在用例圖中提供清楚的、簡(jiǎn)要的用例描述,項(xiàng)目贊助商就很容易看出系統(tǒng)是否提供了必須的功能。
類(lèi)圖
類(lèi)圖表示不同的實(shí)體(人、事物和數(shù)據(jù))如何彼此相關(guān);換句話說(shuō),它顯示了系統(tǒng)的靜態(tài)結(jié)構(gòu)。類(lèi)圖可用于表示邏輯類(lèi),邏輯類(lèi)通常就是業(yè)務(wù)人員所談及的事物種類(lèi) —— 搖滾樂(lè)隊(duì)、CD、廣播劇;或者貸款、住房抵押、汽車(chē)信貸以及利率。類(lèi)圖還可用于表示實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)就是程序員處理的實(shí)體。實(shí)現(xiàn)類(lèi)圖或許會(huì)與邏輯類(lèi)圖顯示一些相同的類(lèi)。然而,實(shí)現(xiàn)類(lèi)圖不會(huì)使用相同的屬性來(lái)描述,因?yàn)樗芸赡芫哂袑?duì)諸如Vector和HashMap這種事物的引用。
類(lèi)在類(lèi)圖上使用包含三個(gè)部分的矩形來(lái)描述,如圖2所示。最上面的部分顯示類(lèi)的名稱(chēng),中間部分包含類(lèi)的屬性,最下面的部分包含類(lèi)的操作(或者說(shuō)”方法”)。
圖2:類(lèi)圖中的示例類(lèi)對(duì)象
根據(jù)我的經(jīng)驗(yàn),幾乎每個(gè)開(kāi)發(fā)人員都知道這個(gè)類(lèi)圖是什么,但是我發(fā)現(xiàn)大多數(shù)程序員都不能正確地描述類(lèi)的關(guān)系。對(duì)于像圖3這樣的類(lèi)圖,您應(yīng)該使用帶有頂點(diǎn)指向父類(lèi)的箭頭的線段來(lái)繪制繼承關(guān)系1,并且箭頭應(yīng)該是一個(gè)完全的三角形。如果兩個(gè)類(lèi)都彼此知道對(duì)方,則應(yīng)該使用實(shí)線來(lái)表示關(guān)聯(lián)關(guān)系;如果只有其中一個(gè)類(lèi)知道該關(guān)聯(lián)關(guān)系,則使用開(kāi)箭頭表示。
圖3:一個(gè)完整的類(lèi)圖,包括了圖2所示的類(lèi)對(duì)象
在圖3中,我們同時(shí)看到了繼承關(guān)系和兩個(gè)關(guān)聯(lián)關(guān)系。CDSalesReport類(lèi)繼承自Report類(lèi)。一個(gè)CDSalesReport類(lèi)與一個(gè)CD類(lèi)關(guān)聯(lián),但是CD類(lèi)并不知道關(guān)于CDSalesReport類(lèi)的任何信息。CD類(lèi)和Band類(lèi)都彼此知道對(duì)方,兩個(gè)類(lèi)彼此都可以與一個(gè)或者多個(gè)對(duì)方類(lèi)相關(guān)聯(lián)。
一個(gè)類(lèi)圖可以整合其他許多概念,這將在本系列文章的后續(xù)文章中介紹。
序列圖
序列圖顯示具體用例(或者是用例的一部分)的詳細(xì)流程。它幾乎是自描述的,并且顯示了流程中不同對(duì)象之間的調(diào)用關(guān)系,同時(shí)還可以很詳細(xì)地顯示對(duì)不同對(duì)象的不同調(diào)用。
序列圖有兩個(gè)維度:垂直維度以發(fā)生的時(shí)間順序顯示消息/調(diào)用的序列;水平維度顯示消息被發(fā)送到的對(duì)象實(shí)例。
序列圖的繪制非常簡(jiǎn)單。橫跨圖的頂部,每個(gè)框(參見(jiàn)圖4)表示每個(gè)類(lèi)的實(shí)例(對(duì)象)。在框中,類(lèi)實(shí)例名稱(chēng)和類(lèi)名稱(chēng)之間用空格/冒號(hào)/空格來(lái)分隔,例如,myReportGenerator : ReportGenerator。如果某個(gè)類(lèi)實(shí)例向另一個(gè)類(lèi)實(shí)例發(fā)送一條消息,則繪制一條具有指向接收類(lèi)實(shí)例的開(kāi)箭頭的連線,并把消息/方法的名稱(chēng)放在連線上面。對(duì)于某些特別重要的消息,您可以繪制一條具有指向發(fā)起類(lèi)實(shí)例的開(kāi)箭頭的虛線,將返回值標(biāo)注在虛線上。就我而言,我總喜歡繪制出包括返回值的虛線,這些額外的信息可以使得序列圖更易于閱讀。
閱讀序列圖也非常簡(jiǎn)單。從左上角啟動(dòng)序列的”驅(qū)動(dòng)”類(lèi)實(shí)例開(kāi)始,然后順著每條消息往下閱讀。記住:雖然圖4所示的例子序列圖顯示了每條被發(fā)送消息的返回消息,但這只是可選的。
圖4:一個(gè)示例序列圖
通過(guò)閱讀圖4中的示例序列圖,您可以明白如何創(chuàng)建一個(gè)CD銷(xiāo)售報(bào)告(CD Sales Report)。其中的aServlet對(duì)象表示驅(qū)動(dòng)類(lèi)實(shí)例。aServlet向名為gen的ReportGenerator類(lèi)實(shí)例發(fā)送一條消息。該消息被標(biāo)為generateCDSalesReport,表示ReportGenerator對(duì)象實(shí)現(xiàn)了這個(gè)消息處理程序。進(jìn)一步理解可發(fā)現(xiàn),generateCDSalesReport消息標(biāo)簽在括號(hào)中包括了一個(gè)cdId,表明aServlet隨該消息傳遞一個(gè)名為cdId的參數(shù)。當(dāng)gen實(shí)例接收到一條generateCDSalesReport消息時(shí),它會(huì)接著調(diào)用CDSalesReport類(lèi),并返回一個(gè)aCDReport的實(shí)例。然后gen實(shí)例對(duì)返回的aCDReport實(shí)例進(jìn)行調(diào)用,在每次消息調(diào)用時(shí)向它傳遞參數(shù)。在該序列的結(jié)尾,gen實(shí)例向它的調(diào)用者aServlet返回一個(gè)aCDReport。
請(qǐng)注意:圖4中的序列圖相對(duì)于典型的序列圖來(lái)說(shuō)太詳細(xì)了。然而,我認(rèn)為它才是足夠易于理解的,并且它顯示了如何表示嵌套的調(diào)用。對(duì)于初級(jí)開(kāi)發(fā)人員來(lái)說(shuō),有時(shí)把一個(gè)序列分解到這種詳細(xì)程度是很有必要的,這有助于他們理解相關(guān)的內(nèi)容。
狀態(tài)圖
狀態(tài)圖表示某個(gè)類(lèi)所處的不同狀態(tài)和該類(lèi)的狀態(tài)轉(zhuǎn)換信息。有人可能會(huì)爭(zhēng)論說(shuō)每個(gè)類(lèi)都有狀態(tài),但不是每個(gè)類(lèi)都應(yīng)該有一個(gè)狀態(tài)圖。只對(duì)”感興趣的”狀態(tài)的類(lèi)(也就是說(shuō),在系統(tǒng)活動(dòng)期間具有三個(gè)或更多潛在狀態(tài)的類(lèi))才進(jìn)行狀態(tài)圖描述。
如圖5所示,狀態(tài)圖的符號(hào)集包括5個(gè)基本元素:初始起點(diǎn),它使用實(shí)心圓來(lái)繪制;狀態(tài)之間的轉(zhuǎn)換,它使用具有開(kāi)箭頭的線段來(lái)繪制;狀態(tài),它使用圓角矩形來(lái)繪制;判斷點(diǎn),它使用空心圓來(lái)繪制;以及一個(gè)或者多個(gè)終止點(diǎn),它們使用內(nèi)部包含實(shí)心圓的圓來(lái)繪制。要繪制狀態(tài)圖,首先繪制起點(diǎn)和一條指向該類(lèi)的初始狀態(tài)的轉(zhuǎn)換線段。狀態(tài)本身可以在圖上的任意位置繪制,然后只需使用狀態(tài)轉(zhuǎn)換線條將它們連接起來(lái)。
?圖5:顯示類(lèi)通過(guò)某個(gè)功能系統(tǒng)的各種狀態(tài)的狀態(tài)圖
圖5中的狀態(tài)圖顯示了它們可以表達(dá)的一些潛在信息。例如,從中可以看出貸款處理系統(tǒng)最初處于Loan Application狀態(tài)。當(dāng)批準(zhǔn)前(pre-approval)過(guò)程完成時(shí),根據(jù)該過(guò)程的結(jié)果,或者轉(zhuǎn)到Loan Pre-approved狀態(tài),或者轉(zhuǎn)到Loan Rejected狀態(tài)。這個(gè)判斷(它是在轉(zhuǎn)換過(guò)程期間做出的)使用一個(gè)判斷點(diǎn)來(lái)表示 —— 即轉(zhuǎn)換線條間的空心圓。通過(guò)該狀態(tài)圖可知,如果沒(méi)有經(jīng)過(guò)Loan Closing狀態(tài),貸款不可能從Loan Pre-Approved狀態(tài)進(jìn)入Loan in Maintenance狀態(tài)。而且,所有貸款都將結(jié)束于Loan Rejected或者Loan in Maintenance狀態(tài)。
活動(dòng)圖
活動(dòng)圖表示在處理某個(gè)活動(dòng)時(shí),兩個(gè)或者更多類(lèi)對(duì)象之間的過(guò)程控制流。活動(dòng)圖可用于在業(yè)務(wù)單元的級(jí)別上對(duì)更高級(jí)別的業(yè)務(wù)過(guò)程進(jìn)行建模,或者對(duì)低級(jí)別的內(nèi)部類(lèi)操作進(jìn)行建模。根據(jù)我的經(jīng)驗(yàn),活動(dòng)圖最適合用于對(duì)較高級(jí)別的過(guò)程建模,比如公司當(dāng)前在如何運(yùn)作業(yè)務(wù),或者業(yè)務(wù)如何運(yùn)作等。這是因?yàn)榕c序列圖相比,活動(dòng)圖在表示上”不夠技術(shù)性的”,但有業(yè)務(wù)頭腦的人們往往能夠更快速地理解它們。
活動(dòng)圖的符號(hào)集與狀態(tài)圖中使用的符號(hào)集類(lèi)似。像狀態(tài)圖一樣,活動(dòng)圖也從一個(gè)連接到初始活動(dòng)的實(shí)心圓開(kāi)始。活動(dòng)是通過(guò)一個(gè)圓角矩形(活動(dòng)的名稱(chēng)包含在其內(nèi))來(lái)表示的。活動(dòng)可以通過(guò)轉(zhuǎn)換線段連接到其他活動(dòng),或者連接到判斷點(diǎn),這些判斷點(diǎn)連接到由判斷點(diǎn)的條件所保護(hù)的不同活動(dòng)。結(jié)束過(guò)程的活動(dòng)連接到一個(gè)終止點(diǎn)(就像在狀態(tài)圖中一樣)。作為一種選擇,活動(dòng)可以分組為泳道(swimlane),泳道用于表示實(shí)際執(zhí)行活動(dòng)的對(duì)象,如圖6所示。
?
圖6:活動(dòng)圖,具有兩個(gè)泳道,表示兩個(gè)對(duì)象的活動(dòng)控制:樂(lè)隊(duì)經(jīng)理,以及報(bào)告工具
圖字(沿箭頭方向):樂(lè)隊(duì)經(jīng)理;報(bào)告工具;選擇”查看樂(lè)隊(duì)的銷(xiāo)售報(bào)告”;檢索該樂(lè)隊(duì)經(jīng)理所管理的樂(lè)隊(duì);顯示報(bào)告條件選擇屏幕;選擇要查看其銷(xiāo)售報(bào)告的樂(lè)隊(duì);從銷(xiāo)售數(shù)據(jù)庫(kù)檢索銷(xiāo)售數(shù)據(jù);顯示銷(xiāo)售報(bào)告。
該活動(dòng)圖中有兩個(gè)泳道,因?yàn)橛袃蓚€(gè)對(duì)象控制著各自的活動(dòng):樂(lè)隊(duì)經(jīng)理和報(bào)告工具。整個(gè)過(guò)程首先從樂(lè)隊(duì)經(jīng)理選擇查看他的樂(lè)隊(duì)銷(xiāo)售報(bào)告開(kāi)始。然后報(bào)告工具檢索并顯示他管理的所有樂(lè)隊(duì),并要求他從中選擇一個(gè)樂(lè)隊(duì)。在樂(lè)隊(duì)經(jīng)理選擇一個(gè)樂(lè)隊(duì)之后,報(bào)告工具就檢索銷(xiāo)售信息并顯示銷(xiāo)售報(bào)告。該活動(dòng)圖表明,顯示報(bào)告是整個(gè)過(guò)程中的最后一步。
組件圖
組件圖提供系統(tǒng)的物理視圖。它的用途是顯示系統(tǒng)中的軟件對(duì)其他軟件組件(例如,庫(kù)函數(shù))的依賴(lài)關(guān)系。組件圖可以在一個(gè)非常高的層次上顯示,從而僅顯示粗粒度的組件,也可以在組件包層次2上顯示。
組件圖的建模最適合通過(guò)例子來(lái)描述。圖7顯示了4個(gè)組件:Reporting Tool、Billboard Service、Servlet 2.2 API和JDBC API。從Reporting Tool組件指向Billboard Service、Servlet 2.2 API和JDBC API組件的帶箭頭的線段,表示Reporting Tool依賴(lài)于那三個(gè)組件。
圖7:組件圖顯示了系統(tǒng)中各種軟件組件的依賴(lài)關(guān)系
部署圖
部署圖表示該軟件系統(tǒng)如何部署到硬件環(huán)境中。它的用途是顯示該系統(tǒng)不同的組件將在何處物理地運(yùn)行,以及它們將如何彼此通信。因?yàn)椴渴饒D是對(duì)物理運(yùn)行情況進(jìn)行建模,系統(tǒng)的生產(chǎn)人員就可以很好地利用這種圖。
部署圖中的符號(hào)包括組件圖中所使用的符號(hào)元素,另外還增加了幾個(gè)符號(hào),包括節(jié)點(diǎn)的概念。一個(gè)節(jié)點(diǎn)可以代表一臺(tái)物理機(jī)器,或代表一個(gè)虛擬機(jī)器節(jié)點(diǎn)(例如,一個(gè)大型機(jī)節(jié)點(diǎn))。要對(duì)節(jié)點(diǎn)進(jìn)行建模,只需繪制一個(gè)三維立方體,節(jié)點(diǎn)的名稱(chēng)位于立方體的頂部。所使用的命名約定與序列圖中相同:[實(shí)例名稱(chēng)] : [實(shí)例類(lèi)型](例如,”w3reporting.myco.com : Application Server”)。
圖8:部署圖
圖字:由于Reporting Tool組件繪制在IBM WebSphere內(nèi)部,后者又繪制在節(jié)點(diǎn)w3.reporting.myco.com內(nèi)部,因而我們知道,用戶將通過(guò)運(yùn)行在本地機(jī)器上的瀏覽器來(lái)訪問(wèn)Reporting Tool,瀏覽器通過(guò)公司intranet上的HTTP協(xié)議與Reporting Tool建立連接。
圖8中的部署圖表明,用戶使用運(yùn)行在本地機(jī)器上的瀏覽器訪問(wèn)Reporting Tool,并通過(guò)公司intranet上的HTTP協(xié)議連接到Reporting Tool組件。這個(gè)工具實(shí)際運(yùn)行在名為w3reporting.myco.com的Application Server上。這個(gè)圖還表明Reporting Tool組件繪制在IBM WebSphere內(nèi)部,后者又繪制在w3.reporting.myco.com節(jié)點(diǎn)內(nèi)部。Reporting Tool使用Java語(yǔ)言通過(guò)IBM DB2數(shù)據(jù)庫(kù)的JDBC接口連接到它的報(bào)告數(shù)據(jù)庫(kù)上,然后該接口又使用本地DB2通信方式,與運(yùn)行在名為db1.myco.com的服務(wù)器上實(shí)際的DB2數(shù)據(jù)庫(kù)通信。除了與報(bào)告數(shù)據(jù)庫(kù)通信外,Report Tool組件還通過(guò)HTTPS上的SOAP與Billboard Service進(jìn)行通信。
結(jié)束語(yǔ)
盡管本文僅提供了對(duì)統(tǒng)一建模語(yǔ)言UML的簡(jiǎn)要介紹,但還是鼓勵(lì)大家把從這里學(xué)到的基本信息應(yīng)用到自己的項(xiàng)目中,同時(shí)更深入地鉆研UML。已經(jīng)有多種軟件工具可以幫助您把UML圖集成到軟件開(kāi)發(fā)過(guò)程中,不過(guò)即使沒(méi)有自動(dòng)化的工具,您也可以使用白板上的標(biāo)記或者紙和筆來(lái)手工繪制UML圖,仍然會(huì)獲益匪淺。
?
?
UML之用例圖解析
?
?
用例圖主要用來(lái)描述“用戶、需求、系統(tǒng)功能單元”之間的關(guān)系。它展示了一個(gè)外部用戶能夠觀察到的系統(tǒng)功能模型圖。
【用途】:幫助開(kāi)發(fā)團(tuán)隊(duì)以一種可視化的方式理解系統(tǒng)的功能需求。
用例圖所包含的元素如下:
1.?參與者(Actor)
表示與您的應(yīng)用程序或系統(tǒng)進(jìn)行交互的用戶、組織或外部系統(tǒng)。用一個(gè)小人表示。
2.?用例(Use Case)
? 用例就是外部可見(jiàn)的系統(tǒng)功能,對(duì)系統(tǒng)提供的服務(wù)進(jìn)行描述。用橢圓表示。
3. 子系統(tǒng)(Subsystem)
用來(lái)展示系統(tǒng)的一部分功能,這部分功能聯(lián)系緊密。
4.?關(guān)系
用例圖中涉及的關(guān)系有:關(guān)聯(lián)、泛化、包含、擴(kuò)展。
如下表所示:
a. 關(guān)聯(lián)(Association)
表示參與者與用例之間的通信,任何一方都可發(fā)送或接受消息。
【箭頭指向】:指向消息接收方
b. 泛化(Inheritance)
就是通常理解的繼承關(guān)系,子用例和父用例相似,但表現(xiàn)出更特別的行為;子用例將繼承父用例的所有結(jié)構(gòu)、行為和關(guān)系。子用例可以使用父用例的一段行為,也可以重載它。父用例通常是抽象的。
【箭頭指向】:指向父用例
c. 包含(Include)
包含關(guān)系用來(lái)把一個(gè)較復(fù)雜用例所表示的功能分解成較小的步驟。
【箭頭指向】:指向分解出來(lái)的功能用例z
d. 擴(kuò)展(Extend)
擴(kuò)展關(guān)系是指用例功能的延伸,相當(dāng)于為基礎(chǔ)用例提供一個(gè)附加功能。
【箭頭指向】:指向基礎(chǔ)用例
e. 依賴(lài)(Dependency)
以上4種關(guān)系,是UML定義的標(biāo)準(zhǔn)關(guān)系。但VS2010的用例模型圖中,添加了依賴(lài)關(guān)系,用帶箭頭的虛線表示,表示源用例依賴(lài)于目標(biāo)用例。
【箭頭指向】:指向被依賴(lài)項(xiàng)
5. 項(xiàng)目(Artifact)
用例圖雖然是用來(lái)幫助人們形象地理解功能需求,但卻沒(méi)多少人能夠通看懂它。很多時(shí)候跟用戶交流甚至用Excel都比用例圖強(qiáng),VS2010中引入了“項(xiàng)目”這樣一個(gè)元素,以便讓開(kāi)發(fā)人員能夠在用例圖中鏈接一個(gè)普通文檔。
用依賴(lài)關(guān)系把某個(gè)用例依賴(lài)到項(xiàng)目上:
然后把項(xiàng)目-》屬性?的Hyperlink設(shè)置到你的文檔上;
這樣當(dāng)你在用例圖上雙擊項(xiàng)目時(shí),就會(huì)打開(kāi)相關(guān)聯(lián)的文檔。
6. 注釋(Comment)
?
包含(include)、擴(kuò)展(extend)、泛化(Inheritance)?的區(qū)別:
條件性:泛化中的子用例和include中的被包含的用例會(huì)無(wú)條件發(fā)生,而extend中的延伸用例的發(fā)生是有條件的;
直接性:泛化中的子用例和extend中的延伸用例為參與者提供直接服務(wù),而include中被包含的用例為參與者提供間接服務(wù)。
對(duì)extend而言,延伸用例并不包含基礎(chǔ)用例的內(nèi)容,基礎(chǔ)用例也不包含延伸用例的內(nèi)容。
對(duì)Inheritance而言,子用例包含基礎(chǔ)用例的所有內(nèi)容及其和其他用例或參與者之間的關(guān)系;
一個(gè)用例圖示例:
?
牢騷:
感覺(jué)用例圖還不成熟,并不能很好地表達(dá)系統(tǒng)的需求,?沒(méi)有UML背景的用戶幾乎不知道畫(huà)的是些什么。
其次,包含關(guān)系、擴(kuò)展關(guān)系的箭頭符號(hào)竟然是同樣的箭頭,僅靠上方寫(xiě)個(gè)文字來(lái)加以區(qū)別,翻譯成其他語(yǔ)言的話,幾乎就不知道代表什么意思。擴(kuò)展關(guān)系的箭頭朝向也很難理解,為何要指向基用例,而不指向擴(kuò)展用例。
VS2010添加的“項(xiàng)目”元素,是個(gè)很好的創(chuàng)新,能夠在用例圖中關(guān)聯(lián)word, excel這些文檔。但為什么不把這些功能直接集成到用例里面,雙擊用例就彈出一份文檔豈不更容易理解,非要畫(huà)蛇添足地加一個(gè)元件,僅僅為了提供個(gè)鏈接功能。?
用例描述表:
鑒于用列圖并不能清楚地表達(dá)功能需求,開(kāi)發(fā)中大家通常用描述表來(lái)補(bǔ)充某些不易表達(dá)的用例,下圖的表給大家提供一個(gè)參考:
?
?
UML之序列圖解析
序列圖主要用于展示對(duì)象之間交互的順序。
序列圖將交互關(guān)系表示為一個(gè)二維圖。縱向是時(shí)間軸,時(shí)間沿豎線向下延伸。橫向軸代表了在協(xié)作中各獨(dú)立對(duì)象的類(lèi)元角色。類(lèi)元角色用生命線表示。當(dāng)對(duì)象存在時(shí),角色用一條虛線表示,當(dāng)對(duì)象的過(guò)程處于激活狀態(tài)時(shí),生命線是一個(gè)雙道線。
消息用從一個(gè)對(duì)象的生命線到另一個(gè)對(duì)象生命線的箭頭表示。箭頭以時(shí)間順序在圖中從上到下排列。?
序列圖中涉及的元素:
1.?生命線:
生命線名稱(chēng)可帶下劃線。當(dāng)使用下劃線時(shí),意味著序列圖中的生命線代表一個(gè)類(lèi)的特定實(shí)例。
?
2.?同步消息
發(fā)送人在它繼續(xù)之前,將等待同步消息響應(yīng)。
?
3.?異步消息
在發(fā)送方繼續(xù)之前,無(wú)需等待響應(yīng)的消息。
?
4.?注釋
5.?約束
約束的符號(hào)很簡(jiǎn)單;格式是: [Boolean Test]
?
6.?組合片段
組合片段用來(lái)解決交互執(zhí)行的條件及方式。它允許在序列圖中直接表示邏輯組件,用于通過(guò)指定條件或子進(jìn)程的應(yīng)用區(qū)域,為任何生命線的任何部分定義特殊條件和子進(jìn)程。
常用的組合片段有:
抉擇(Alt)
抉擇用來(lái)指明在兩個(gè)或更多的消息序列之間的互斥的選擇,相當(dāng)于經(jīng)典的if..else..。
抉擇在任何場(chǎng)合下只發(fā)生一個(gè)序列。?可以在每個(gè)片段中設(shè)置一個(gè)臨界來(lái)指示該片段可以運(yùn)行的條件。else?的臨界指示其他任何臨界都不為?True?時(shí)應(yīng)運(yùn)行的片段。如果所有臨界都為?False?并且沒(méi)有?else,則不執(zhí)行任何片段。
?
選項(xiàng)(Opt)
包含一個(gè)可能發(fā)生或不發(fā)生的序列
?
循環(huán)(Loop)
片段重復(fù)一定次數(shù)。?可以在臨界中指示片段重復(fù)的條件。
?
并行(Par)
?
下表列出了常用的組合片段:
| 片段類(lèi)型 | 名稱(chēng) | 說(shuō)明 |
| Opt | 選項(xiàng) | 包含一個(gè)可能發(fā)生或可能不發(fā)生的序列。?可以在臨界中指定序列發(fā)生的條件。 |
| Alt | 抉擇 | 包含一個(gè)片段列表,這些片段包含備選消息序列。?在任何場(chǎng)合下只發(fā)生一個(gè)序列。 可以在每個(gè)片段中設(shè)置一個(gè)臨界來(lái)指示該片段可以運(yùn)行的條件。?else?的臨界指示其他任何臨界都不為?True?時(shí)應(yīng)運(yùn)行的片段。?如果所有臨界都為?False?并且沒(méi)有?else,則不執(zhí)行任何片段。 |
| Loop | 循環(huán) | 片段重復(fù)一定次數(shù)。?可以在臨界中指示片段重復(fù)的條件。 Loop?組合片段具有“Min”和“Max”屬性,它們指示片段可以重復(fù)的最小和最大次數(shù)。?默認(rèn)值是無(wú)限制。 |
| Break | 中斷 | 如果執(zhí)行此片段,則放棄序列的其余部分。?可以使用臨界來(lái)指示發(fā)生中斷的條件。 |
| Par | 并行 | 并行處理。?片段中的事件可以交錯(cuò)。 |
| Critical | 關(guān)鍵 | 用在?Par?或?Seq?片段中。?指示此片段中的消息不得與其他消息交錯(cuò)。 |
| Seq | 弱順序 | 有兩個(gè)或更多操作數(shù)片段。?涉及同一生命線的消息必須以片段的順序發(fā)生。?如果消息涉及的生命線不同,來(lái)自不同片段的消息可能會(huì)并行交錯(cuò)。 |
| Strict | 強(qiáng)順序 | 有兩個(gè)或更多操作數(shù)片段。?這些片段必須按給定順序發(fā)生。 |
有關(guān)如何解釋序列的片段
默認(rèn)情況下,序列圖表明可能發(fā)生的一系列消息。?在運(yùn)行的系統(tǒng)中,可能會(huì)出現(xiàn)您未選擇顯示在關(guān)系圖上的其他消息。
以下片段類(lèi)型可用于更改此釋義:
| 片段類(lèi)型 | 名稱(chēng) | 說(shuō)明 |
| Consider | 考慮 | 指定此片段描述的消息列表。?其他消息可發(fā)生在運(yùn)行的系統(tǒng)中,但對(duì)此描述來(lái)說(shuō)意義不大。 在“Messages”屬性中鍵入該列表。 |
| Ignore | 忽略 | 此片段未描述的消息列表。?這些消息可發(fā)生在運(yùn)行的系統(tǒng)中,但對(duì)此描述來(lái)說(shuō)意義不大。 在“Messages”屬性中鍵入該列表。 |
| Assert | 斷言 | 操作數(shù)片段指定唯一有效的序列。?通常用在?Consider?或?Ignore?片段中。 |
| Neg | 否定 | 此片段中顯示的序列不得發(fā)生。?通常用在?Consider?或?Ignore?片段中。 |
?
UML之活動(dòng)圖解析
?
一、活動(dòng)圖的組成元素?Activity Diagram Element
1、活動(dòng)狀態(tài)圖(Activity)
2、動(dòng)作狀態(tài)(Actions)
3、動(dòng)作狀態(tài)約束(Action Constraints)
4、動(dòng)作流(Control Flow)
5、開(kāi)始節(jié)點(diǎn)(Initial Node)
6、終止節(jié)點(diǎn)(Final Node)
7、對(duì)象(Objects)
8、數(shù)據(jù)存儲(chǔ)對(duì)象(DataStore)
9、對(duì)象流(Object Flows)
10、分支與合并(Decision and Merge Nodes)
11、分叉與匯合(Fork and Join Nodes)
12、異常處理(Exception Handler)
13、活動(dòng)中斷區(qū)域(Interruptible Activity Region)
14、泳道(Partition)
二、活動(dòng)圖案例分析
三、總結(jié)
?
活動(dòng)圖是UML用于對(duì)系統(tǒng)的動(dòng)態(tài)行為建模的另一種常用工具,它描述活動(dòng)的順序,展現(xiàn)從一個(gè)活動(dòng)到另一個(gè)活動(dòng)的控制流。活動(dòng)圖在本質(zhì)上是一種流程圖。活動(dòng)圖著重表現(xiàn)從一個(gè)活動(dòng)到另一個(gè)活動(dòng)的控制流,是內(nèi)部處理驅(qū)動(dòng)的流程。
一、活動(dòng)圖的組成元素?Activity Diagram Element
1、活動(dòng)狀態(tài)圖(Activity)
活動(dòng)狀態(tài)用于表達(dá)狀態(tài)機(jī)中的非原子的運(yùn)行,其特點(diǎn)如下:
(1)、活動(dòng)狀態(tài)可以分解成其他子活動(dòng)或者動(dòng)作狀態(tài)。
(2)、活動(dòng)狀態(tài)的內(nèi)部活動(dòng)可以用另一個(gè)活動(dòng)圖來(lái)表示。
(3)、和動(dòng)作狀態(tài)不同,活動(dòng)狀態(tài)可以有入口動(dòng)作和出口動(dòng)作,也可以有內(nèi)部轉(zhuǎn)移。
(4)、動(dòng)作狀態(tài)是活動(dòng)狀態(tài)的一個(gè)特例,如果某個(gè)活動(dòng)狀態(tài)只包括一個(gè)動(dòng)作,那么它就是一個(gè)動(dòng)作狀態(tài)。
UML中活動(dòng)狀態(tài)和動(dòng)作狀態(tài)的圖標(biāo)相同,但是活動(dòng)狀態(tài)可以在圖標(biāo)中給出入口動(dòng)作和出口動(dòng)作等信息。
?
?
2、動(dòng)作狀態(tài)(Actions)
動(dòng)作狀態(tài)是指原子的,不可中斷的動(dòng)作,并在此動(dòng)作完成后通過(guò)完成轉(zhuǎn)換轉(zhuǎn)向另一個(gè)狀態(tài)。動(dòng)作狀態(tài)有如下特點(diǎn):
(1)、動(dòng)作狀態(tài)是原子的,它是構(gòu)造活動(dòng)圖的最小單位。
(2)、動(dòng)作狀態(tài)是不可中斷的。
(3)、動(dòng)作狀態(tài)是瞬時(shí)的行為。
(4)、動(dòng)作狀態(tài)可以有入轉(zhuǎn)換,入轉(zhuǎn)換既可以是動(dòng)作流,也可以是對(duì)象流。動(dòng)作狀態(tài)至少有一條出轉(zhuǎn)換,這條轉(zhuǎn)換以內(nèi)部的完成為起點(diǎn),與外部事件無(wú)關(guān)。
(5)、動(dòng)作狀態(tài)與狀態(tài)圖中的狀態(tài)不同,它不能有入口動(dòng)作和出口動(dòng)作,更不能有內(nèi)部轉(zhuǎn)移。
(6)、在一張活動(dòng)圖中,動(dòng)作狀態(tài)允許多處出現(xiàn)。
UML中的動(dòng)作狀態(tài)圖用平滑的圓角矩形表示,如下:
?
3、動(dòng)作狀態(tài)約束(Action Constraints)
動(dòng)作狀態(tài)約束:用來(lái)約束動(dòng)作狀態(tài)。如下圖展示了動(dòng)作狀態(tài)的前置條件和后置條件
4、動(dòng)作流(Control Flow)
動(dòng)作之間的轉(zhuǎn)換稱(chēng)之為動(dòng)作流,活動(dòng)圖的轉(zhuǎn)換用帶箭頭的直線表示,箭頭的方向指向轉(zhuǎn)入的方向。
5、開(kāi)始節(jié)點(diǎn)(Initial Node)
開(kāi)始節(jié)點(diǎn):表示成實(shí)心黑色圓點(diǎn)
?
6、終止節(jié)點(diǎn)(Final Node)
分為活動(dòng)終止節(jié)點(diǎn)(activity final nodes)和流程終止節(jié)點(diǎn)(flow final nodes)。
活動(dòng)終止節(jié)點(diǎn)表示整個(gè)活動(dòng)的結(jié)束
而流程終止節(jié)點(diǎn)表示是子流程的結(jié)束。
7、對(duì)象(Objects)
8、數(shù)據(jù)存儲(chǔ)對(duì)象(DataStore)
使用關(guān)鍵字?datastore?
?
9、對(duì)象流(Object Flows)
對(duì)象流是動(dòng)作狀態(tài)或者活動(dòng)狀態(tài)與對(duì)象之間的依賴(lài)關(guān)系,表示動(dòng)作使用對(duì)象或動(dòng)作對(duì)對(duì)象的影響。用活動(dòng)圖描述某個(gè)對(duì)象時(shí),可以把涉及到的對(duì)象放置在活動(dòng)圖中并用一個(gè)依賴(lài)將其連接到進(jìn)行創(chuàng)建、修改和撤銷(xiāo)的動(dòng)作狀態(tài)或者活動(dòng)狀態(tài)上,對(duì)象的這種使用方法就構(gòu)成了對(duì)象流。
對(duì)象流中的對(duì)象有以下特點(diǎn):
(1)、一個(gè)對(duì)象可以由多個(gè)動(dòng)作操作。
(2)、一個(gè)動(dòng)作輸出的對(duì)象可以作為另一個(gè)動(dòng)作輸入的對(duì)象。
(3)、在活動(dòng)圖中,同一個(gè)對(duì)象可以多次出現(xiàn),它的每一次出現(xiàn)表面該對(duì)象正處于對(duì)象生存期的不同時(shí)間點(diǎn)。
對(duì)象流用帶有箭頭的虛線表示。如果箭頭是從動(dòng)作狀態(tài)出發(fā)指向?qū)ο?#xff0c;則表示動(dòng)作對(duì)對(duì)象施加了一定的影響。施加的影響包括創(chuàng)建、修改和撤銷(xiāo)等。如果箭頭從對(duì)象指向動(dòng)作狀態(tài),則表示該動(dòng)作使用對(duì)象流所指向的對(duì)象。
狀態(tài)圖中的對(duì)象用矩形表示,矩形內(nèi)是該對(duì)象的名稱(chēng),名稱(chēng)下的方括號(hào)表明對(duì)象此時(shí)的狀態(tài)。
10、分支與合并(Decision and Merge Nodes)
分支與合并用菱形表示
11、分叉與匯合(Fork and Join Nodes)
分為水平風(fēng)向和垂直方向。
對(duì)象在運(yùn)行時(shí)可能會(huì)存在兩個(gè)或多個(gè)并發(fā)運(yùn)行的控制流,為了對(duì)并發(fā)的控制流建模,UML中引入了分叉與匯合的概念。分叉用于將動(dòng)作流分為兩個(gè)或多個(gè)并發(fā)運(yùn)行的分支,而匯合則用于同步這些并發(fā)分支,以達(dá)到共同完成一項(xiàng)事務(wù)的目的。
12、異常處理(Exception Handler)
當(dāng)受保護(hù)的活動(dòng)發(fā)生異常時(shí),觸發(fā)異常處理節(jié)點(diǎn)。
?
?
13、活動(dòng)中斷區(qū)域(Interruptible Activity Region)
活動(dòng)中斷區(qū)域圍繞一些可被中斷的動(dòng)作狀態(tài)圖。比如下圖,正常情況下【Process Order】順序流轉(zhuǎn)到【Close Order】,訂單處理流程完畢;但在【Process Order】過(guò)稱(chēng)中,會(huì)發(fā)送【Cancel Order】請(qǐng)求,這時(shí)會(huì)流轉(zhuǎn)到【Cancel Order】,從而訂單處理流程結(jié)束
14、泳道(Partition)
泳道將活動(dòng)圖中的活動(dòng)劃分為若干組,并把每一組指定給負(fù)責(zé)這組活動(dòng)的業(yè)務(wù)組織,即對(duì)象。在活動(dòng)圖中,泳道區(qū)分了負(fù)責(zé)活動(dòng)的對(duì)象,它明確地表示了哪些活動(dòng)是由哪些對(duì)象進(jìn)行的。在包含泳道的活動(dòng)圖中,每個(gè)活動(dòng)只能明確地屬于一個(gè)泳道。
泳道是用垂直實(shí)線繪出,垂直線分隔的區(qū)域就是泳道。在泳道的上方可以給出泳道的名字或?qū)ο蟮拿?#xff0c;該對(duì)象負(fù)責(zé)泳道內(nèi)的全部活動(dòng)。泳道沒(méi)有順序,不同泳道中的活動(dòng)既可以順序進(jìn)行也可以并發(fā)進(jìn)行,動(dòng)作流和對(duì)象流允許穿越分隔線。
?
二、活動(dòng)圖案例分析
?
1、??泳道分為:會(huì)員泳道和系統(tǒng)泳道。會(huì)員選擇商品并加入購(gòu)物車(chē),系統(tǒng)完成訂單生成及其支付完畢。
2、??開(kāi)始節(jié)點(diǎn):會(huì)員添加商品到購(gòu)物車(chē),點(diǎn)擊【訂單確認(rèn)】,開(kāi)始交于系統(tǒng)處理訂單流程
3、??結(jié)束節(jié)點(diǎn):商品發(fā)送完畢和付款成功,訂單處理流程結(jié)束
4、??活動(dòng)狀態(tài):產(chǎn)生訂單、Check Credit Cart核對(duì)信用卡、Check Stock?核對(duì)庫(kù)存量、Deliver Goods?發(fā)送商品、Process Credit Cart付款
5、??分叉與匯合:【產(chǎn)生訂單】份叉為檢查庫(kù)存量和會(huì)員支付金額是否足夠,如果不足,取消訂單,如過(guò)庫(kù)存量和支付金額足夠,發(fā)送商品和付款,最后匯合為訂單完成。
三、總結(jié)
活動(dòng)圖描述的是對(duì)象活動(dòng)的順序關(guān)系所遵循的規(guī)則,它著重表現(xiàn)的是系統(tǒng)的行為,而非系統(tǒng)的處理過(guò)程。活動(dòng)圖能夠表示并發(fā)活動(dòng)的情形,活動(dòng)圖是面向?qū)ο蟮摹?/p>
?
?
UML之關(guān)系圖解析
?
?
一、簡(jiǎn)介
二、類(lèi)的構(gòu)成
三、類(lèi)之間的關(guān)系(Relationship)
1、單向關(guān)聯(lián)
2、雙向關(guān)聯(lián)
3、自身關(guān)聯(lián)
4、多維關(guān)聯(lián)(N-ary Association)
5、泛化(Generalization)
6、依賴(lài)(Dependency)
7、聚合(Aggregation)
8、組合(Composite)
四、總結(jié)
一、簡(jiǎn)介
類(lèi)是對(duì)象的集合,展示了對(duì)象的結(jié)構(gòu)以及與系統(tǒng)的交互行為。類(lèi)主要有屬性(Attribute)和方法(Method)構(gòu)成,屬性代表對(duì)象的狀態(tài),如果屬性被保存到數(shù)據(jù)庫(kù),此稱(chēng)之為“持久化”;方法代表對(duì)象的操作行為,類(lèi)具有繼承關(guān)系,可以繼承于父類(lèi),也可以與其他的Class進(jìn)行交互。
???????類(lèi)圖展示了系統(tǒng)的邏輯結(jié)構(gòu),類(lèi)和接口的關(guān)系。
二、類(lèi)的構(gòu)成
類(lèi)主要有屬性和方法構(gòu)成。比如商品屬性有:名稱(chēng)、價(jià)格、高度、寬度等;商品的方法有:計(jì)算稅率,獲得商品的評(píng)價(jià)等等。如下圖
?
三、類(lèi)之間的關(guān)系(Relationship)
關(guān)聯(lián)(Association)
兩個(gè)相對(duì)獨(dú)立的對(duì)象,當(dāng)一個(gè)對(duì)象的實(shí)例與另外一個(gè)對(duì)象的特定實(shí)例存在固定關(guān)系時(shí),這兩個(gè)對(duì)象之間就存在關(guān)聯(lián)關(guān)系。
1、單向關(guān)聯(lián)
A1->A2:?表示A1認(rèn)識(shí)A2,A1知道A2的存在,A1可以調(diào)用A2中的方法和屬性
場(chǎng)景:訂單和商品,訂單中包括商品,但是商品并不了解訂單的存在。
類(lèi)與類(lèi)之間的單向關(guān)聯(lián)圖:
?
C#代碼:
Public class Order
{
?????? Public List<Product> order;
Public?void?AddOrder(Product product )
?????? {
????????????? order.Add(product);
}????????????
}
Public Class Product
{
}
代碼表現(xiàn)為:Order(A1)中有Product(A2)的變量或者引用
?
2、雙向關(guān)聯(lián)
B1-B2:?表示B1認(rèn)識(shí)B2,B1知道B2的存在,B1可以調(diào)用B2中的方法和屬性;同樣B2也知道B1的存在,B2也可以調(diào)用B1的方法和屬性。
場(chǎng)景:訂單和客戶,訂單屬于客戶,客戶擁有一些特定的訂單
類(lèi)與類(lèi)之間的雙向關(guān)聯(lián)圖
?
?
C#代碼
Public class User
{
?????? Public List<Order> GetOrder()
?????? {
}????? return new List<Order>();
}
Public Class Order
{
?????? Public User GetUserByOrderID(string OrderId )
?????? {
????????????? Return new User();
}
}
?
3、自身關(guān)聯(lián)
同一個(gè)類(lèi)對(duì)象之間的關(guān)聯(lián)
類(lèi)與類(lèi)之間自身關(guān)聯(lián)圖
4、多維關(guān)聯(lián)(N-ary Association)
多個(gè)對(duì)象之間存在關(guān)聯(lián)
場(chǎng)景:公司雇用員工,同時(shí)公司需要支付工資給員工
類(lèi)與類(lèi)之間的多維關(guān)聯(lián)圖:
?
?
5、泛化(Generalization)
類(lèi)與類(lèi)的繼承關(guān)系,類(lèi)與接口的實(shí)現(xiàn)關(guān)系。
場(chǎng)景:父與子、動(dòng)物與人、植物與樹(shù)、系統(tǒng)使用者與B2C會(huì)員和B2E會(huì)員的關(guān)系
類(lèi)與類(lèi)之間的泛化圖:
?
系統(tǒng)的使用者包括:B2C會(huì)員、B2B會(huì)員和B2E會(huì)員。
接口的實(shí)現(xiàn),動(dòng)物都有吃的行為,而人是動(dòng)物的一個(gè)具體實(shí)例,實(shí)現(xiàn)具體Eat的動(dòng)作
?
?
6、依賴(lài)(Dependency)
類(lèi)A要完成某個(gè)功能必須引用類(lèi)B,則A與B存在依賴(lài)關(guān)系,依賴(lài)關(guān)系是弱的關(guān)聯(lián)關(guān)系。C#不建議雙相依賴(lài),也就是相互引用
場(chǎng)景:本來(lái)人與電腦沒(méi)有關(guān)系的,但由于偶然的機(jī)會(huì),人需要用電腦寫(xiě)程序,這時(shí)候人就依賴(lài)于電腦。
類(lèi)與類(lèi)的依賴(lài)關(guān)系圖
?
在程序中一般為?using?引用。
?
7、聚合(Aggregation)
當(dāng)對(duì)象A被加入到對(duì)象B中,成為對(duì)象B的組成部分時(shí),對(duì)象B和對(duì)象A之間為聚合關(guān)系。聚合是關(guān)聯(lián)關(guān)系的一種,是較強(qiáng)的關(guān)聯(lián)關(guān)系,強(qiáng)調(diào)的是整體與部分之間的關(guān)系。
場(chǎng)景:商品和他的規(guī)格、樣式就是聚合關(guān)系。
類(lèi)與類(lèi)的聚合關(guān)系圖
?
?
?
8、組合(Composite)
???????對(duì)象A包含對(duì)象B,對(duì)象B離開(kāi)對(duì)象A沒(méi)有實(shí)際意義。是一種更強(qiáng)的關(guān)聯(lián)關(guān)系。人包含手,手離開(kāi)人的軀體就失去了它應(yīng)有的作用。
場(chǎng)景:?Window窗體由滑動(dòng)條slider、頭部Header?和工作區(qū)Panel組合而成。
類(lèi)與類(lèi)的組合關(guān)系圖
?
?
四、總結(jié)
?本文針對(duì)類(lèi)之間常用的關(guān)系進(jìn)行了簡(jiǎn)單的描述,主要有:關(guān)聯(lián)關(guān)系、泛化、依賴(lài)、聚合和組合。
?
?
?
UML之狀態(tài)圖解析
?
?
狀態(tài)圖目錄:
一、狀態(tài)圖簡(jiǎn)介(Brief introduction)
二、狀態(tài)圖元素(State Diagram Elements)
1、狀態(tài)(States)
2、轉(zhuǎn)移(Transitions)
3、動(dòng)作(State Actions)
4、自身轉(zhuǎn)移(Self-Transitions)
5、組合狀態(tài)(Compound States)
6、進(jìn)入節(jié)點(diǎn)(Entry Point)
7、退出節(jié)點(diǎn)(Exit Point)
8、歷史狀態(tài)(History States)
9、并發(fā)區(qū)域(Concurrent Regions)
三、狀態(tài)圖案例分析(State Diagram Example Analysis)
??????四、總結(jié)(Summary)
?
一、狀態(tài)圖簡(jiǎn)介(Brief introduction)
?
狀態(tài)圖(Statechart Diagram)主要用于描述一個(gè)對(duì)象在其生存期間的動(dòng)態(tài)行為,表現(xiàn)為一個(gè)對(duì)象所經(jīng)歷的狀態(tài)序列,引起狀態(tài)轉(zhuǎn)移的事件(Event),以及因狀態(tài)轉(zhuǎn)移而伴隨的動(dòng)作(Action)。一般可以用狀態(tài)機(jī)對(duì)一個(gè)對(duì)象的生命周期建模,狀態(tài)圖用于顯示狀態(tài)機(jī)(State?Machine Diagram),重點(diǎn)在與描述狀態(tài)圖的控制流。
如下圖例子,狀態(tài)機(jī)描述了門(mén)對(duì)象的生存期間的狀態(tài)序列,引起轉(zhuǎn)移的事件,以及因狀態(tài)轉(zhuǎn)移而伴隨的動(dòng)作(Action).
狀態(tài)有Opened、Closed、Locked。
事件有?Open、Close、Lock和Unlock。
注意:
1、?????????????并不是所有的事件都會(huì)引起狀態(tài)的轉(zhuǎn)移,比如當(dāng)門(mén)是處于【Opened】狀態(tài),不能進(jìn)行【Lock】事件。
2、?????????????轉(zhuǎn)移(Transition)有警備條件(guard condition),比如只有doorWay->isEmpty?條件滿足時(shí),才會(huì)響應(yīng)事件。
?
二、狀態(tài)圖元素(State Diagram Elements)
?
1、狀態(tài)(States)
??? 指在對(duì)象的生命周期中的某個(gè)條件或者狀況,在此期間對(duì)象將滿足某些條件、執(zhí)行某些活動(dòng)活活等待某些事件。所有對(duì)象都有狀態(tài),狀態(tài)是對(duì)象執(zhí)行了一系列活動(dòng)的結(jié)果,當(dāng)某個(gè)事件發(fā)生后,對(duì)象的狀態(tài)將發(fā)生變化。
狀態(tài)用圓角矩形表示
初態(tài)和終態(tài)(Initial and Final States)
初態(tài)用實(shí)心圓點(diǎn)表示,終態(tài)用圓形內(nèi)嵌圓點(diǎn)表示。
?
2、轉(zhuǎn)移(Transitions)
??? 轉(zhuǎn)移(Transitions)是兩個(gè)狀態(tài)之間的一種關(guān)系,表示對(duì)象將在源狀態(tài)(Source State)中執(zhí)行一定的動(dòng)作,并在某個(gè)特定事件發(fā)生而且某個(gè)特定的警界條件滿足時(shí)進(jìn)入目標(biāo)狀態(tài)(Target State)
??????事件標(biāo)記(Trigger):是轉(zhuǎn)移的誘因,可以是一個(gè)信號(hào),事件、條件變化(a change in some condition)和時(shí)間表達(dá)式。
??????警界條件(Guard Condition):當(dāng)警界條件滿足時(shí),事件才會(huì)引發(fā)轉(zhuǎn)移(Transition)。
??????結(jié)果(Effect):對(duì)象狀態(tài)轉(zhuǎn)移后的結(jié)果。
?
3、動(dòng)作(State Actions)
動(dòng)作(Actions)是一個(gè)可執(zhí)行的原子操作,也就是說(shuō)動(dòng)作是不可中斷的,其執(zhí)行時(shí)間是可忽略不計(jì)的。
在上例中,對(duì)象狀態(tài)轉(zhuǎn)移后的結(jié)果顯示在轉(zhuǎn)移線上,如果目標(biāo)狀態(tài)有許多轉(zhuǎn)移,而且每個(gè)轉(zhuǎn)移有相同的結(jié)果,這時(shí)把轉(zhuǎn)移后的結(jié)果(Effect)展示在目標(biāo)狀態(tài)中(Target State)更好一些,可以定義進(jìn)入動(dòng)作(Entry Action?)和退出動(dòng)作(Exit Action),如下圖
?
4、自身轉(zhuǎn)移(Self-Transitions)
??? 狀態(tài)可以有返回自身狀態(tài)的轉(zhuǎn)移,稱(chēng)之為自身轉(zhuǎn)移(Self-Transitions)
2S后,Poll?input事件執(zhí)行,轉(zhuǎn)移到自己狀態(tài)【W(wǎng)aiting】
?
5、組合狀態(tài)(Compound States)
??? 嵌套在另外一個(gè)狀態(tài)中的狀態(tài)稱(chēng)之為子狀態(tài)(sub-state),一個(gè)含有子狀態(tài)的狀態(tài)被稱(chēng)作組合狀態(tài)(Compound States).?如下圖,【Check PIN】是組合狀態(tài),【Enter PIN】是子狀態(tài)。
也可用以下方式進(jìn)行描述
如上圖,狀態(tài)機(jī)【Check PIN】的細(xì)節(jié)被分割到另外一個(gè)圖中了。
?
6、進(jìn)入節(jié)點(diǎn)(Entry Point)
??? 如下圖所示,由于一些原因并不會(huì)執(zhí)行初始化(initialization),而是直接通過(guò)一個(gè)節(jié)點(diǎn)進(jìn)入狀態(tài)【Ready】,則此節(jié)點(diǎn)稱(chēng)之為進(jìn)入節(jié)點(diǎn)(Entry Point)
?
7、退出節(jié)點(diǎn)(Exit Point)
?
8、歷史狀態(tài)(History States)
??? 歷史狀態(tài)是一個(gè)偽狀態(tài)(Pseudostate),其目的是記住從組合狀態(tài)中退出時(shí)所處的子狀態(tài),當(dāng)再次進(jìn)入組合狀態(tài),可直接進(jìn)入這個(gè)子狀態(tài),而不是再次從組合狀態(tài)的初態(tài)開(kāi)始。
在上圖的狀態(tài)圖中,正常的狀態(tài)順序是:【W(wǎng)ashing】- >【Rinsing】->【Spinning】。
如果是從狀態(tài)【Rinsing】突然停電(Power Cut)退出,,洗衣機(jī)停止工作進(jìn)入狀態(tài)【Power Off】,當(dāng)電力恢復(fù)時(shí)直接進(jìn)入狀態(tài)【Running】。
?
9、并發(fā)區(qū)域(Concurrent Regions)
??? 狀態(tài)圖可以分為區(qū)域,而區(qū)域又包括退出或者當(dāng)前執(zhí)行的子狀態(tài)。說(shuō)明組合狀態(tài)在某一時(shí)刻可以同時(shí)達(dá)到多個(gè)子狀態(tài)。如下圖剎車(chē)系統(tǒng),同時(shí)進(jìn)入前剎車(chē)【Applying Front Brakes】狀態(tài)和后剎車(chē)【Applying Rear Brakes】狀態(tài)。
?
三、狀態(tài)圖案例分析(State Diagram Example Analysis)
?
按照blink518的建議(“出貨中”是屬于條件分支應(yīng)該使用Decision),改成如下圖也是很好的做法:
訂單成立狀態(tài)主要有:
訂單成立
訂單取消(Guard:會(huì)員訂單-繳款期限已過(guò)期)
備貨中(Guard:已付款、訂單成立、庫(kù)存量足夠)
出貨中(Effect:扣除商品可接單量及移除購(gòu)物車(chē)中的購(gòu)買(mǎi)資料)
出貨確認(rèn)(Guard:實(shí)際配達(dá)日及發(fā)票代碼、號(hào)碼均不為空值)
出貨完畢(Guard:實(shí)際配達(dá)日不為空)
出貨失敗
訂單成立(Guard:出貨完畢,已付款、鑒賞期結(jié)束日期?小于等于?[系統(tǒng)日期])
?
分析:
1、購(gòu)物車(chē)生成訂單進(jìn)入狀態(tài)【訂單成立】
2、系統(tǒng)檢測(cè)訂單已經(jīng)付款并且?guī)齑媪孔銐?#xff0c;則進(jìn)入狀態(tài)【備貨中】
3、物流發(fā)貨,進(jìn)入狀態(tài)【發(fā)貨中】,狀態(tài)轉(zhuǎn)移為【發(fā)貨中】后,需要做的操作有“扣除商品可接單量及移除購(gòu)物車(chē)中的購(gòu)買(mǎi)資料”
4、發(fā)貨完畢后,狀態(tài)分為【出貨確認(rèn)】和狀態(tài)【出貨失敗】,如果狀態(tài)是【出貨失敗】,則【結(jié)束】,如果狀態(tài)為【出貨確認(rèn)】,則進(jìn)入下一步。
5、配貨人員填寫(xiě)實(shí)際配達(dá)日期,進(jìn)入狀態(tài)【出貨完畢】。
6、如果”已付款、鑒賞期結(jié)束日期?小于等于?[系統(tǒng)日期]”,則【訂單成立】。
?
四、總結(jié)(Summary)
?
???????狀態(tài)圖重點(diǎn)在于描述對(duì)象的狀態(tài)及其狀態(tài)之間的轉(zhuǎn)移,狀態(tài)圖的基本元素主要有:狀態(tài)、轉(zhuǎn)移、動(dòng)作、自身轉(zhuǎn)移、組合狀態(tài)、進(jìn)入節(jié)點(diǎn)、退出節(jié)點(diǎn)、歷史狀態(tài)、并發(fā)區(qū)域等,狀態(tài)中的事件分為調(diào)用事件(Call)、變化事件(Change)、時(shí)間事件(Time)和信號(hào)事件(Singal)。最后以實(shí)例對(duì)狀態(tài)對(duì)進(jìn)行了分析。
?
?
?
?
UML之時(shí)序圖解析
?
?
?一、時(shí)序圖簡(jiǎn)介(Brief introduction)
???????二、時(shí)序圖元素(Sequence Diagram Elements)
角色(Actor)
對(duì)象(Object)
生命線(Lifeline)
控制焦點(diǎn)(Focus of Control)
消息(Message)
自關(guān)聯(lián)消息(Self-Message)
Combined Fragments
?
?
?? 三、時(shí)序圖實(shí)例分析(Sequece Diagram Example Analysis)
?
時(shí)序圖場(chǎng)景
時(shí)序圖實(shí)例
時(shí)序圖實(shí)例分析
?????? 四、總結(jié)(Summary)
?
一、時(shí)序圖簡(jiǎn)介(Brief introduction)
???????時(shí)序圖(Sequence Diagram)是顯示對(duì)象之間交互的圖,這些對(duì)象是按時(shí)間順序排列的。順序圖中顯示的是參與交互的對(duì)象及其對(duì)象之間消息交互的順序。時(shí)序圖中包括的建模元素主要有:對(duì)象(Actor)、生命線(Lifeline)、控制焦點(diǎn)(Focus of control)、消息(Message)等等。
二、時(shí)序圖元素(Sequence Diagram Elements)
??角色(Actor)
?? 系統(tǒng)角色,可以是人、及其甚至其他的系統(tǒng)或者子系統(tǒng)。
??對(duì)象(Object)
? 對(duì)象包括三種命名方式:
? 第一種方式包括對(duì)象名和類(lèi)名;
? 第二中方式只顯示類(lèi)名不顯示對(duì)象名,即表示他是一個(gè)匿名對(duì)象;
? 第三種方式只顯示對(duì)象名不顯示類(lèi)明。
?
??生命線(Lifeline)
? 生命線在順序圖中表示為從對(duì)象圖標(biāo)向下延伸的一條虛線,表示對(duì)象存在的時(shí)間,如下圖
?
??控制焦點(diǎn)(Focus of Control)
?
? 控制焦點(diǎn)是順序圖中表示時(shí)間段的符號(hào),在這個(gè)時(shí)間段內(nèi)對(duì)象將執(zhí)行相應(yīng)的操作。用小矩形表示,如下圖。
???????
??消息(Message)
? 消息一般分為同步消息(Synchronous Message),異步消息(Asynchronous Message)和返回消息(Return Message).如下圖所示:
?
?
? 同步消息=調(diào)用消息(Synchronous Message)
? 消息的發(fā)送者把控制傳遞給消息的接收者,然后停止活動(dòng),等待消息的接收者放棄或者返回控制。用來(lái)表示同步的意義。
?
? 異步消息(Asynchronous Message)
? 消息發(fā)送者通過(guò)消息把信號(hào)傳遞給消息的接收者,然后繼續(xù)自己的活動(dòng),不等待接受者返回消息或者控制。異步消息的接收者和發(fā)送者是并發(fā)工作的。
?
? 返回消息(Return Message)
? 返回消息表示從過(guò)程調(diào)用返回
?
??自關(guān)聯(lián)消息(Self-Message)
? 表示方法的自身調(diào)用以及一個(gè)對(duì)象內(nèi)的一個(gè)方法調(diào)用另外一個(gè)方法。
??Combined Fragments
?
? ??????????Alternative fragment(denoted “alt”)?與?if…then…else對(duì)應(yīng)
? ??????????Option fragment (denoted “opt”)?與?Switch對(duì)應(yīng)
? ??????????Parallel fragment (denoted “par”)?表示同時(shí)發(fā)生
? ??????????Loop fragment(denoted “l(fā)oop”)?與?for?或者?Foreach對(duì)應(yīng)
?
三、時(shí)序圖實(shí)例分析(Sequece Diagram Example Analysis)
??時(shí)序圖場(chǎng)景
完成課程創(chuàng)建功能,主要流程有:
1、請(qǐng)求添加課程頁(yè)面,填寫(xiě)課程表單,點(diǎn)擊【create】按鈕
2、添加課程信息到數(shù)據(jù)庫(kù)
3、向課程對(duì)象追加主題信息
4、為課程指派教師
5、完成課程創(chuàng)建功能
?
時(shí)序圖實(shí)例
?
時(shí)序圖實(shí)例分析
1、序號(hào)1.0-1.3??完成頁(yè)面的初始化
2、序號(hào)1.4-1.5??課程管理員填充課程表單
3、序號(hào)1.6-1.7??課程管理員點(diǎn)擊【Create】按鈕,并響應(yīng)點(diǎn)擊事件
4、序號(hào)1.8?????Service層創(chuàng)建課程
5、序號(hào)1.9-1.10?添加課程到數(shù)據(jù)庫(kù),并返回課程編號(hào)CourseId
6、序號(hào)1.11-1.12?添加課程主題到數(shù)據(jù)庫(kù),并返回主題編號(hào)topicId
7、序號(hào)1.13?????????給課程指派教師
8、序號(hào)1.14?????????向界面拋創(chuàng)建課程成功與否的消息
四、總結(jié)(Summary)
???????時(shí)序圖(Sequence Diagram)是顯示對(duì)象之間交互的圖,這些對(duì)象是按時(shí)間順序排列的。順序圖中顯示的是參與交互的對(duì)象及其對(duì)象之間消息交互的順序。時(shí)序圖中包括的建模元素主要有:對(duì)象(Actor)、生命線(Lifeline)、控制焦點(diǎn)(Focus of control)、消息(Message)等等。最后,以課程創(chuàng)建功能演示一時(shí)序圖實(shí)例。
?
?
實(shí)例演示 – 基于UML的面向?qū)ο蠓治雠c設(shè)計(jì)
?
? ?摘要
????? 本文以實(shí)例的方式,展示了如何使用UML進(jìn)行面向?qū)ο蟮姆治雠c設(shè)計(jì)。本文將假設(shè)讀者對(duì)UML、面向?qū)ο蟮阮I(lǐng)域的基本內(nèi)容已了然于胸,所以將不會(huì)過(guò)多闡述,而將重點(diǎn)放在應(yīng)用過(guò)程上。本文的目的是通過(guò)一個(gè)完整的實(shí)例,展現(xiàn)基于UML的OOA&D過(guò)程?的一個(gè)簡(jiǎn)化模式,幫助朋友們更好的認(rèn)識(shí)UML在OOA&D中起的作用。
????? 前言
????? 經(jīng)常聽(tīng)到有朋友抱怨,說(shuō)學(xué)了UML不知該怎么用,或者畫(huà)了UML卻覺(jué)得沒(méi)什么作用。其實(shí),就UML本身來(lái)說(shuō),它只是一種交流工具,它作為一種標(biāo)準(zhǔn)化交流符號(hào),在OOA&D過(guò)程中開(kāi)發(fā)人員間甚至開(kāi)發(fā)人員與客戶之間傳遞信息。另外,UML也可以看做是OO思想的一種表現(xiàn)形式,可以說(shuō)“OO是神,而UML是型”。所以,想用好UML,扎實(shí)的OO思想基礎(chǔ)是必不可少的。然而,在UML應(yīng)用到開(kāi)發(fā)過(guò)程中時(shí),還是有一定的模式可以遵循的。(注意,是模式而不是教條,我下面給出的流程只是一個(gè)啟發(fā)式過(guò)程,而不是說(shuō)一定要遵循這個(gè)流程。)下面,我們通過(guò)一個(gè)CMS系統(tǒng)的分析設(shè)計(jì)實(shí)例,看看如何將UML應(yīng)用到實(shí)際的開(kāi)發(fā)中。
????? 1.從需求到業(yè)務(wù)用例圖
????? OOA&D的第一步,就是了解用戶需求,并將其轉(zhuǎn)換為業(yè)務(wù)用例圖。我們的CMS系統(tǒng)需求非常簡(jiǎn)單,大致課做如下描述:這個(gè)系統(tǒng)主要用來(lái)發(fā)布新聞,管理員只需要一個(gè),登錄后可以在后臺(tái)發(fā)布新聞。任何人可以瀏覽新聞,瀏覽者可以注冊(cè)成為系統(tǒng)會(huì)員,注冊(cè)后可對(duì)新聞進(jìn)行評(píng)論。管理員在后臺(tái)可以對(duì)新聞、評(píng)論、注冊(cè)會(huì)員進(jìn)行管理,如修改、刪除等。
????? 通過(guò)以上需求描述,我們畫(huà)出如下的業(yè)務(wù)用例圖:
????? 這里要注意三點(diǎn):
??????1.業(yè)務(wù)用例是僅從系統(tǒng)業(yè)務(wù)角度關(guān)注的用例,而不是具體系統(tǒng)的用例。它描述的是“該實(shí)現(xiàn)什么業(yè)務(wù)”,而不是“系統(tǒng)該提供什么操作”。例如,在實(shí)際系統(tǒng)中,“登錄”肯定要作為一個(gè)用例,但是這是軟件系統(tǒng)中的操作,而用戶所關(guān)注的業(yè)務(wù)是不包含“登錄”的。
????? 2.業(yè)務(wù)用例僅包含客戶“感興趣”的內(nèi)容。
????? 3.業(yè)務(wù)用例所有的用例名應(yīng)該讓客戶能看懂,如果某個(gè)用例的名字客戶看不懂什么意思,它也許就不適合作為業(yè)務(wù)用例。
????? 2.從業(yè)務(wù)用例圖到活動(dòng)圖
????? 完成了業(yè)務(wù)用例圖后,我們要為每一個(gè)業(yè)務(wù)用例繪制一幅活動(dòng)圖。活動(dòng)圖描述了這個(gè)業(yè)務(wù)用例中,用戶可能會(huì)進(jìn)行的操作序列。活動(dòng)圖有個(gè)很重要的使命:從業(yè)務(wù)用例分析出系統(tǒng)用例。例如,下面是“新聞管理”的活動(dòng)圖:
????? 可以看到,一個(gè)“新聞管理”這個(gè)業(yè)務(wù)用例,分解出N多系統(tǒng)操作。這里要特別注意這些操作,其中很多“活動(dòng)”都很可能是一個(gè)系統(tǒng)用例(當(dāng)然,不是每個(gè)都是)。例如,由這個(gè)活動(dòng)圖可以看出,系統(tǒng)中至少要包含以下備選系統(tǒng)用例:登錄、注銷(xiāo)登錄、查看新聞列表、修改新聞、刪除新聞。
????? 這樣,將每個(gè)業(yè)務(wù)用例都繪制出相應(yīng)的活動(dòng)圖,再將其中的“活動(dòng)”整合,就得出所有備選系統(tǒng)用例。
????? 3.從活動(dòng)圖到系統(tǒng)用例圖
????? 找出所有的備選系統(tǒng)用例后,我們要對(duì)他們進(jìn)行合并和篩選。合并就是將相同的用例合并成一個(gè),篩選就是將不符合系統(tǒng)用例條件的備選用例去掉。
??????一個(gè)系統(tǒng)用例應(yīng)該是實(shí)際使用系統(tǒng)的用戶所進(jìn)行的一個(gè)操作,例如,“查看新聞列表”就不能算一個(gè)系統(tǒng)用例,因?yàn)樗皇悄诚到y(tǒng)用例的一個(gè)序列項(xiàng)。
????? 最終我們得出的系統(tǒng)用例圖如下:
????? 4.從系統(tǒng)用例圖到用例規(guī)約
????? 得出系統(tǒng)用例圖后,我們應(yīng)該對(duì)每一個(gè)系統(tǒng)用例給出用例規(guī)約。關(guān)于用例規(guī)約,沒(méi)有一個(gè)通用的格式,大家可以按照習(xí)慣的格式進(jìn)行編寫(xiě)。對(duì)用例規(guī)約唯一的要求就是“清晰易懂”。
????? 下面給出“登錄”這個(gè)系統(tǒng)用例的一個(gè)規(guī)約:
????? 5.繪制業(yè)務(wù)領(lǐng)域類(lèi)圖
????? 完成了上面幾步,下面應(yīng)該是繪制業(yè)務(wù)領(lǐng)域類(lèi)圖了。所謂業(yè)務(wù)領(lǐng)域類(lèi)圖要描述一下三點(diǎn):
??????1.系統(tǒng)中有哪些實(shí)體。
????? 2.這些實(shí)體能做什么操作。
????? 3.實(shí)體間的關(guān)系。
????? 這里要特別強(qiáng)調(diào):這里的實(shí)體不是Actor,而是Actor使用系統(tǒng)時(shí)使用的所調(diào)用的實(shí)體,是處在系統(tǒng)邊界之內(nèi)的實(shí)體。例如,管理員就沒(méi)有作為一個(gè)實(shí)體出現(xiàn)在這里,因?yàn)楣芾韱T處在系統(tǒng)邊界之外,它所有的工作都可以通過(guò)調(diào)用這三個(gè)類(lèi)的方法完成。并且,這里的“注冊(cè)會(huì)員”實(shí)體也不是剛才用例圖中注冊(cè)會(huì)員這個(gè)Actor,而是作為一個(gè)系統(tǒng)內(nèi)的業(yè)務(wù)實(shí)體,供Actor們使用的。例如,其中的注冊(cè)功能是給注冊(cè)會(huì)員這個(gè)Actor使用,而移除則是給管理員這個(gè)Actor使用的。
????? 理解以上這段話非常重要,我經(jīng)常看到由于混淆了實(shí)體和Actor的關(guān)系而導(dǎo)致畫(huà)出的領(lǐng)域類(lèi)圖不準(zhǔn)確或職責(zé)分配不準(zhǔn)確。
??????大家可能還注意到,我們這里沒(méi)有給出每個(gè)實(shí)體的屬性。其實(shí),在領(lǐng)域分析階段,實(shí)體的屬性并不重要,重要的是找出實(shí)體的操作。??
????? 6.繪制實(shí)現(xiàn)類(lèi)圖
????? 以上這幾步,就是分析的過(guò)程。而下面的步驟就是設(shè)計(jì)了。
????? 設(shè)計(jì)沒(méi)有分析那么好描述,因?yàn)榉治鍪恰翱蛻裘妗?#xff0c;它只關(guān)心系統(tǒng)本身的功能和業(yè)務(wù),而不關(guān)心任何和計(jì)算機(jī)有關(guān)的東西。但是,設(shè)計(jì)和平臺(tái)、語(yǔ)言、開(kāi)發(fā)模型等內(nèi)容關(guān)系緊密,因而很難找出一個(gè)一致的過(guò)程。但是,一般在設(shè)計(jì)過(guò)程中實(shí)現(xiàn)類(lèi)圖是要繪制的。
????? 實(shí)現(xiàn)類(lèi)圖和領(lǐng)域類(lèi)圖不一樣,它描述的是真正系統(tǒng)的靜態(tài)結(jié)構(gòu),是和最后的代碼完全一致的。因此,它和平臺(tái)關(guān)系密切,必須準(zhǔn)確給出系統(tǒng)中的實(shí)體類(lèi)、控制類(lèi)、界面類(lèi)、接口等元素以及其中的關(guān)系。因此,實(shí)現(xiàn)類(lèi)圖是很復(fù)雜的,而且是平臺(tái)技術(shù)有關(guān)的。所以,我在這里不可能給出一個(gè)準(zhǔn)確的實(shí)現(xiàn)類(lèi)圖,不過(guò)為了描述,我還是給出一個(gè)簡(jiǎn)化了的實(shí)現(xiàn)類(lèi)圖,當(dāng)然,它是不準(zhǔn)確的,而只是從形式上給出實(shí)現(xiàn)類(lèi)圖的樣子。
????? 我們假設(shè)這個(gè)系統(tǒng)建構(gòu)于.NET 3.5平臺(tái)上,并且使用ASP.NET MVC作為表示層,整體使用三層架構(gòu)。那么,用戶模塊體系的實(shí)現(xiàn)類(lèi)圖大體是這樣子(不準(zhǔn)確):
????? 7.繪制序列圖
????? 有了靜態(tài)結(jié)構(gòu),我們還要給出動(dòng)態(tài)結(jié)構(gòu),這樣,才能看清系統(tǒng)間的類(lèi)是如何交互的,從而有效幫助程序員進(jìn)行編碼工作。
????? 上圖給出的是用戶登錄的序列圖。首先注冊(cè)會(huì)員作為Actor,調(diào)用UserController的Login方法啟動(dòng)序列,然后序列按圖示步驟執(zhí)行。其中UserServices作為業(yè)務(wù)組件,首先調(diào)用數(shù)據(jù)訪問(wèn)組件的GetByName確定用戶是否存在,如果存在,再調(diào)用GetByNameAndPassword確定輸入密碼是否是此用戶的密碼。從而完成業(yè)務(wù)功能。
????? 要注意,序列圖在實(shí)際中是很多的,幾乎每個(gè)類(lèi)方法都配有相應(yīng)的序列圖。
????? 8.后面的步驟
????? 在完成了上面的過(guò)程后,就可以進(jìn)行編碼、調(diào)試、測(cè)試等工作了。但這些已經(jīng)超出了本文討論的范圍。
????? 總結(jié)
????? 本文簡(jiǎn)要給出了使用UML進(jìn)行OOA&D的過(guò)程。當(dāng)然,由于示例較小,而且本人水平有限,所以給出的相關(guān)內(nèi)容可能不是很準(zhǔn)確。而且軟件分析設(shè)計(jì)本來(lái)就不是一個(gè)固定模式的過(guò)程,隨著系統(tǒng)的不同整個(gè)過(guò)程會(huì)有變化。本文只是想起到一個(gè)拋磚引玉的作用,讓朋友們大致了解UML的使用流程。至于實(shí)際的分析設(shè)計(jì),還需要深入的學(xué)習(xí)和實(shí)踐的積累。
UML類(lèi)圖關(guān)系(泛化 、繼承、實(shí)現(xiàn)、依賴(lài)、關(guān)聯(lián)、聚合、組合)
?
?
繼承、實(shí)現(xiàn)、依賴(lài)、關(guān)聯(lián)、聚合、組合的聯(lián)系與區(qū)別
分別介紹這幾種關(guān)系:
繼承
指的是一個(gè)類(lèi)(稱(chēng)為子類(lèi)、子接口)繼承另外的一個(gè)類(lèi)(稱(chēng)為父類(lèi)、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類(lèi)與類(lèi)或者接口與接口之間最常見(jiàn)的關(guān)系;在Java中此類(lèi)關(guān)系通過(guò)關(guān)鍵字extends明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒(méi)有爭(zhēng)議性;
實(shí)現(xiàn)
指的是一個(gè)class類(lèi)實(shí)現(xiàn)interface接口(可以是多個(gè))的功能;實(shí)現(xiàn)是類(lèi)與接口之間最常見(jiàn)的關(guān)系;在Java中此類(lèi)關(guān)系通過(guò)關(guān)鍵字implements明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒(méi)有爭(zhēng)議性;
依賴(lài)
可以簡(jiǎn)單的理解,就是一個(gè)類(lèi)A使用到了另一個(gè)類(lèi)B,而這種使用關(guān)系是具有偶然性的、、臨時(shí)性的、非常弱的,但是B類(lèi)的變化會(huì)影響到A;比如某人要過(guò)河,需要借用一條船,此時(shí)人與船之間的關(guān)系就是依賴(lài);表現(xiàn)在代碼層面,為類(lèi)B作為參數(shù)被類(lèi)A在某個(gè)method方法中使用;
關(guān)聯(lián)
他體現(xiàn)的是兩個(gè)類(lèi)、或者類(lèi)與接口之間語(yǔ)義級(jí)別的一種強(qiáng)依賴(lài)關(guān)系,比如我和我的朋友;這種關(guān)系比依賴(lài)更強(qiáng)、不存在依賴(lài)關(guān)系的偶然性、關(guān)系也不是臨時(shí)性的,一般是長(zhǎng)期性的,而且雙方的關(guān)系一般是平等的、關(guān)聯(lián)可以是單向、雙向的;表現(xiàn)在代碼層面,為被關(guān)聯(lián)類(lèi)B以類(lèi)屬性的形式出現(xiàn)在關(guān)聯(lián)類(lèi)A中,也可能是關(guān)聯(lián)類(lèi)A引用了一個(gè)類(lèi)型為被關(guān)聯(lián)類(lèi)B的全局變量;
聚合
聚合是關(guān)聯(lián)關(guān)系的一種特例,他體現(xiàn)的是整體與部分、擁有的關(guān)系,即has-a的關(guān)系,此時(shí)整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個(gè)整體對(duì)象,也可以為多個(gè)整體對(duì)象共享;比如計(jì)算機(jī)與CPU、公司與員工的關(guān)系等;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語(yǔ)義級(jí)別來(lái)區(qū)分;
組合
組合也是關(guān)聯(lián)關(guān)系的一種特例,他體現(xiàn)的是一種contains-a的關(guān)系,這種關(guān)系比聚合更強(qiáng),也稱(chēng)為強(qiáng)聚合;他同樣體現(xiàn)整體與部分間的關(guān)系,但此時(shí)整體與部分是不可分的,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束;比如你和你的大腦;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語(yǔ)義級(jí)別來(lái)區(qū)分;
對(duì)于繼承、實(shí)現(xiàn)這兩種關(guān)系沒(méi)多少疑問(wèn),他們體現(xiàn)的是一種類(lèi)與類(lèi)、或者類(lèi)與接口間的縱向關(guān)系;其他的四者關(guān)系則體現(xiàn)的是類(lèi)與類(lèi)、或者類(lèi)與接口間的引用、橫向關(guān)系,是比較難區(qū)分的,有很多事物間的關(guān)系要想準(zhǔn)備定位是很難的,前面也提到,這幾種關(guān)系都是語(yǔ)義級(jí)別的,所以從代碼層面并不能完全區(qū)分各種關(guān)系;
但總的來(lái)說(shuō),后幾種關(guān)系所表現(xiàn)的強(qiáng)弱程度依次為:組合>聚合>關(guān)聯(lián)>依賴(lài);
聚合跟組合其實(shí)都屬于關(guān)聯(lián) 只不過(guò)它們是兩種特殊的關(guān)聯(lián) 因?yàn)楸臼峭?所以它們之間難免會(huì)有相似之處 下面讓我們一起來(lái)看一下它們之間有何不同
聚合與組合的概念相信不用我在此贅述大家就已經(jīng)了解了 下面直接上例子
程老師的《大話》里舉大那個(gè)大雁的例子很貼切 在此我就借用一下 大雁喜歡熱鬧害怕孤獨(dú) 所以它們一直過(guò)著群居的生活 這樣就有了雁群 每一只大雁都有自己的雁群 每個(gè)雁群都有好多大雁 大雁與雁群的這種關(guān)系就可以稱(chēng)之為聚合 另外每只大雁都有兩只翅膀 大雁與雁翅的關(guān)系就叫做組合 有此可見(jiàn) 聚合的關(guān)系明顯沒(méi)有組合緊密 大雁不會(huì)因?yàn)樗鼈兊娜褐鲗⒀闳航馍⒍鵁o(wú)法生存 而雁翅就無(wú)法脫離大雁而單獨(dú)生存——組合關(guān)系的類(lèi)具有相同的生命周期
聚合關(guān)系圖:
組合關(guān)系圖:
從從代碼上看這兩種關(guān)系的區(qū)別在于:
構(gòu)造函數(shù)不同
雁群類(lèi):
?
?
?
大雁類(lèi):
?
?
聚合關(guān)系的類(lèi)里含有另一個(gè)類(lèi)作為參數(shù)?
雁群類(lèi)(GooseGroup)的構(gòu)造函數(shù)中要用到大雁(Goose)作為參數(shù)把值傳進(jìn)來(lái) 大雁類(lèi)(Goose)可以脫離雁群類(lèi)而獨(dú)立存在?
組合關(guān)系的類(lèi)里含有另一個(gè)類(lèi)的實(shí)例化?
大雁類(lèi)(Goose)在實(shí)例化之前 一定要先實(shí)例化翅膀類(lèi)(Wings) 兩個(gè)類(lèi)緊密耦合在一起 它們有相同的生命周期 翅膀類(lèi)(Wings)不可以脫離大雁類(lèi)(Goose)而獨(dú)立存在
信息的封裝性不同?
在聚合關(guān)系中,客戶端可以同時(shí)了解雁群類(lèi)和大雁類(lèi),因?yàn)樗麄兌际仟?dú)立的?
而在組合關(guān)系中,客戶端只認(rèn)識(shí)大雁類(lèi),根本就不知道翅膀類(lèi)的存在,因?yàn)槌岚蝾?lèi)被嚴(yán)密的封裝在大雁類(lèi)中。
——————————————————————————————————-
UML-泛化、關(guān)聯(lián)、聚合、組合、依賴(lài)
一、泛化關(guān)系(generalization)
1.說(shuō)明
表示類(lèi)與類(lèi)之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類(lèi)對(duì)接口的實(shí)現(xiàn)關(guān)系。一般化的關(guān)系是從子類(lèi)指向父類(lèi)的,與繼承或?qū)崿F(xiàn)的方法相反。
2.例圖
3.表現(xiàn)
父類(lèi) 父類(lèi)實(shí)例=new 子類(lèi)();
4.舉例
class Animal{};
class Tigger : public Animal{};
class Dog : public Animal{};
Animal* pAnimal = new Dog;
二、關(guān)聯(lián)關(guān)系(association)
1.說(shuō)明
對(duì)于兩個(gè)相對(duì)獨(dú)立的對(duì)象,當(dāng)一個(gè)對(duì)象的實(shí)例與另一個(gè)對(duì)象的一些特定實(shí)例存在固定的對(duì)應(yīng)關(guān)系時(shí),這兩個(gè)對(duì)象之間為關(guān)聯(lián)關(guān)系。
表示類(lèi)與類(lèi)之間的聯(lián)接,有雙向關(guān)聯(lián)和單向關(guān)聯(lián),雙向關(guān)聯(lián)有兩個(gè)箭頭或者沒(méi)有箭頭,單向關(guān)聯(lián)有一個(gè)箭頭,表示關(guān)聯(lián)的方向。
關(guān)聯(lián)關(guān)系以實(shí)例變量的形式存在,在每一個(gè)關(guān)聯(lián)的端點(diǎn),還可以有一個(gè)基數(shù)(multiplicity),表明這一端點(diǎn)的類(lèi)可以有幾個(gè)實(shí)例。
2.例圖
3.表現(xiàn)
雙向關(guān)聯(lián)在代碼的表現(xiàn)為雙方都擁有對(duì)方的一個(gè)指針,當(dāng)然也可以是引用或者是值。
關(guān)聯(lián)關(guān)系是使用實(shí)例變量來(lái)實(shí)現(xiàn)。
4.舉例
//eg.1
//單向關(guān)聯(lián)
class Person{};
class Friend
{
Person* mpPerson;
};
//eg.2
//雙向關(guān)聯(lián)
class A;
class B
{
A* pA;
};
class A
{
B* pB;
};
//eg.3
//自身關(guān)聯(lián)
class C
{
C* pC;
};
三、聚合關(guān)系(aggregation)
1.說(shuō)明:
關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系。聚合是整體和個(gè)體的關(guān)系。聚合關(guān)系也是通過(guò)實(shí)例變量實(shí)現(xiàn)的。例如汽車(chē)、發(fā)動(dòng)機(jī)、輪胎,一個(gè)汽車(chē)對(duì)象由一個(gè)發(fā)動(dòng)機(jī)對(duì)象,四個(gè)輪胎對(duì)象組成。
當(dāng)類(lèi)之間有整體-部分關(guān)系的時(shí)候,我們就可以使用組合或者聚合。
2.例圖
3.表現(xiàn)
與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過(guò)實(shí)例變量來(lái)實(shí)現(xiàn)這樣關(guān)系的。關(guān)聯(lián)關(guān)系和聚合關(guān)系來(lái)語(yǔ)法上是沒(méi)辦法區(qū)分的,從語(yǔ)義上才能更好的區(qū)分兩者的區(qū)別。
4.舉例
class CPU{};
class Memory{};
class Computer
{
CPU* mpCPU;
Memory* mpMemory;
};
四、組合關(guān)系(合成關(guān)系)(composition)
1.說(shuō)明:
合成關(guān)系也是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系更強(qiáng)的關(guān)系。合成關(guān)系是不能共享的。例如人有四肢、頭等。
表示類(lèi)之間整體和部分的關(guān)系,組合關(guān)系中部分和整體具有統(tǒng)一的生存期。一旦整體對(duì)象不存在,部分對(duì)象也將不存在。部分對(duì)象與整體對(duì)象之間具有共生死的關(guān)系。
2.例圖
3.表現(xiàn)
4.舉例
//同聚合關(guān)系,不過(guò)說(shuō)語(yǔ)義不同
class Leg{};
class Arm{};
class Person
{
Leg mLeg;
Arm mArm;
};
五、依賴(lài)關(guān)系(Dependency)
1.說(shuō)明:
對(duì)于兩個(gè)相對(duì)獨(dú)立的對(duì)象,當(dāng)一個(gè)對(duì)象負(fù)責(zé)構(gòu)造另一個(gè)對(duì)象的實(shí)例,或者依賴(lài)另一個(gè)對(duì)象的服務(wù)時(shí),這兩個(gè)對(duì)象之間主要體現(xiàn)為依賴(lài)關(guān)系。
與關(guān)聯(lián)關(guān)系不同的是,依賴(lài)關(guān)系是以參數(shù)變量的形式傳入到依賴(lài)類(lèi)中的,依賴(lài)是單向的,要避免雙向依賴(lài)。一般來(lái)說(shuō),不應(yīng)該存在雙向依賴(lài)。
依賴(lài)是一種弱關(guān)聯(lián),只要一個(gè)類(lèi)用到另一個(gè)類(lèi),但是和另一個(gè)類(lèi)的關(guān)系不是太明顯的時(shí)候(可以說(shuō)是“uses”了那個(gè)類(lèi)),就可以把這種關(guān)系看成是依賴(lài)。
2.例圖
3.表現(xiàn)
依賴(lài)關(guān)系表現(xiàn)在局部變量,方法的參數(shù),以及對(duì)靜態(tài)方法的調(diào)用
4.舉例
class Car{};
class House{};
class Person
{
void buy(Car& car){}
void buy(House* pHouse){}
};
六、關(guān)系之間的區(qū)別
1.聚合與組合
(1)聚合與組合都是一種結(jié)合關(guān)系,只是額外具有整體-部分的意涵。
(2)部件的生命周期不同
聚合關(guān)系中,整件不會(huì)擁有部件的生命周期,所以整件刪除時(shí),部件不會(huì)被刪除。再者,多個(gè)整件可以共享同一個(gè)部件。?
組合關(guān)系中,整件擁有部件的生命周期,所以整件刪除時(shí),部件一定會(huì)跟著刪除。而且,多個(gè)整件不可以同時(shí)間共享同一個(gè)部件。
(3)聚合關(guān)系是“has-a”關(guān)系,組合關(guān)系是“contains-a”關(guān)系。
2.關(guān)聯(lián)和聚合
(1)表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語(yǔ)義級(jí)別來(lái)區(qū)分。
(2)關(guān)聯(lián)和聚合的區(qū)別主要在語(yǔ)義上,關(guān)聯(lián)的兩個(gè)對(duì)象之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的。
(3)關(guān)聯(lián)是一種結(jié)構(gòu)化的關(guān)系,指一種對(duì)象和另一種對(duì)象有聯(lián)系。
(4)關(guān)聯(lián)和聚合是視問(wèn)題域而定的,例如在關(guān)心汽車(chē)的領(lǐng)域里,輪胎是一定要組合在汽車(chē)類(lèi)中的,因?yàn)樗x開(kāi)了汽車(chē)就沒(méi)有意義了。但是在賣(mài)輪胎的店鋪業(yè)務(wù)里,就算輪胎離開(kāi)了汽車(chē),它也是有意義的,這就可以用聚合了。
3.關(guān)聯(lián)和依賴(lài)
(1)關(guān)聯(lián)關(guān)系中,體現(xiàn)的是兩個(gè)類(lèi)、或者類(lèi)與接口之間語(yǔ)義級(jí)別的一種強(qiáng)依賴(lài)關(guān)系,比如我和我的朋友;這種關(guān)系比依賴(lài)更強(qiáng)、不存在依賴(lài)關(guān)系的偶然性、關(guān)系也不是臨時(shí)性的,一般是長(zhǎng)期性的,而且雙方的關(guān)系一般是平等的。
(2)依賴(lài)關(guān)系中,可以簡(jiǎn)單的理解,就是一個(gè)類(lèi)A使用到了另一個(gè)類(lèi)B,而這種使用關(guān)系是具有偶然性的、臨時(shí)性的、非常弱的,但是B類(lèi)的變化會(huì)影響到A。
4.綜合比較
這幾種關(guān)系都是語(yǔ)義級(jí)別的,所以從代碼層面并不能完全區(qū)分各種關(guān)系;但總的來(lái)說(shuō),后幾種關(guān)系所表現(xiàn)的強(qiáng)弱程度依次為:
組合>聚合>關(guān)聯(lián)>依賴(lài);
———————————————————————————————————————————————–
UML 線條 箭頭
關(guān)系
后面的例子將針對(duì)某個(gè)具體目的來(lái)獨(dú)立地展示各種關(guān)系。雖然語(yǔ)法無(wú)誤,但這些例子可進(jìn)一步精煉,在它們的有效范圍內(nèi)包括更多的語(yǔ)義。
依賴(lài)(Dependency)
實(shí)體之間一個(gè)“使用”關(guān)系暗示一個(gè)實(shí)體的規(guī)范發(fā)生變化后,可能影響依賴(lài)于它的其他實(shí)例(圖D)。 更具體地說(shuō),它可轉(zhuǎn)換為對(duì)不在實(shí)例作用域內(nèi)的一個(gè)類(lèi)或?qū)ο蟮娜魏晤?lèi)型的引用。其中包括一個(gè)局部變量,對(duì)通過(guò)方法調(diào)用而獲得的一個(gè)對(duì)象的引用(如下例所 示),或者對(duì)一個(gè)類(lèi)的靜態(tài)方法的引用(同時(shí)不存在那個(gè)類(lèi)的一個(gè)實(shí)例)。也可利用“依賴(lài)”來(lái)表示包和包之間的關(guān)系。由于包中含有類(lèi),所以你可根據(jù)那些包中的 各個(gè)類(lèi)之間的關(guān)系,表示出包和包的關(guān)系。
圖D
關(guān)聯(lián)(Association)
實(shí)體之間的一個(gè)結(jié)構(gòu)化關(guān)系表明對(duì)象是相互連接的。箭頭是可選的,它用于指定導(dǎo)航能力。如果沒(méi)有箭頭,暗示是一種雙向的導(dǎo)航能力。在Java中,關(guān)聯(lián)(圖E) 轉(zhuǎn)換為一個(gè)實(shí)例作用域的變量,就像圖E的“Java”區(qū)域所展示的代碼那樣。可為一個(gè)關(guān)聯(lián)附加其他修飾符。多重性(Multiplicity)修飾符暗示 著實(shí)例之間的關(guān)系。在示范代碼中,Employee可以有0個(gè)或更多的TimeCard對(duì)象。但是,每個(gè)TimeCard只從屬于單獨(dú)一個(gè) Employee。
圖E
?
聚合(Aggregation)
聚合(圖F)是關(guān)聯(lián)的一種形式,代表兩個(gè)類(lèi)之間的整體/局部關(guān)系。聚合暗示著整體在概念上處于比局部更高的一個(gè)級(jí)別,而關(guān)聯(lián)暗示兩個(gè)類(lèi)在概念上位于相同的級(jí)別。聚合也轉(zhuǎn)換成Java中的一個(gè)實(shí)例作用域變量。
關(guān)聯(lián)和聚合的區(qū)別純粹是概念上的,而且嚴(yán)格反映在語(yǔ)義上。聚合還暗示著實(shí)例圖中不存在回路。換言之,只能是一種單向關(guān)系。
圖F
?
合成(Composition)
合成 (圖G) 是聚合的一種特殊形式,暗示“局部”在“整體”內(nèi)部的生存期職責(zé)。合成也是非共享的。所以,雖然局部不一定要隨整體的銷(xiāo)毀而被銷(xiāo)毀,但整體要么負(fù)責(zé)保持局 部的存活狀態(tài),要么負(fù)責(zé)將其銷(xiāo)毀。局部不可與其他整體共享。但是,整體可將所有權(quán)轉(zhuǎn)交給另一個(gè)對(duì)象,后者隨即將承擔(dān)生存期職責(zé)。
Employee和TimeCard的關(guān)系或許更適合表示成“合成”,而不是表示成“關(guān)聯(lián)”。
圖G
?
泛化(Generalization)
泛化(圖H)表示一個(gè)更泛化的元素和一個(gè)更具體的元素之間的關(guān)系。泛化是用于對(duì)繼承進(jìn)行建模的UML元素。在Java中,用extends關(guān)鍵字來(lái)直接表示這種關(guān)系。
圖H
?
實(shí)現(xiàn)(Realization)
實(shí)例(圖I)關(guān)系指定兩個(gè)實(shí)體之間的一個(gè)合同。換言之,一個(gè)實(shí)體定義一個(gè)合同,而另一個(gè)實(shí)體保證履行該合同。對(duì)Java應(yīng)用程序進(jìn)行建模時(shí),實(shí)現(xiàn)關(guān)系可直接用implements關(guān)鍵字來(lái)表示。
圖I
?
———————————————————————————————————————————————–
UML類(lèi)圖關(guān)系主要有關(guān)聯(lián),依賴(lài),泛化,實(shí)現(xiàn)等,那么它們的表示方法你是否熟悉,本文就像大家介紹一下UML類(lèi)圖關(guān)系的表示方法。
AD:
本節(jié)和大家一起學(xué)習(xí)一下UML類(lèi)圖關(guān)系的表示方法,主要包括關(guān)聯(lián),聚合,泛化,實(shí)現(xiàn),依賴(lài)等內(nèi)容,希望通過(guò)本節(jié)的學(xué)習(xí)大家對(duì)UML類(lèi)圖關(guān)系的表示方法有一定的掌握。下面是具體介紹。
UML基礎(chǔ)
1:UML類(lèi)間關(guān)系的種類(lèi)
2:關(guān)聯(lián)
UML類(lèi)圖關(guān)系中關(guān)聯(lián)描述了系統(tǒng)中對(duì)象或?qū)嵗g的離散連接,關(guān)聯(lián)帶有系統(tǒng)中各個(gè)對(duì)象之間關(guān)系的信息。
2.1關(guān)聯(lián)表示法
2.2聚集與組合
3:泛化,繼承【Generalization】
UML類(lèi)圖關(guān)系中泛化關(guān)系是類(lèi)元的一般描述和具體描述之間的關(guān)系,具體描述建立在一般描述的基礎(chǔ)之上,并對(duì)其進(jìn)行了擴(kuò)展。
4:實(shí)現(xiàn)【realization】
UML類(lèi)圖關(guān)系中實(shí)現(xiàn)關(guān)系將一種模型元素(如類(lèi))與另一種模型元素(如接口)連接起來(lái),其中接口只是行為的說(shuō)明而不是結(jié)構(gòu)或者實(shí)現(xiàn)。
5:依賴(lài)【Dependence】
UML類(lèi)圖關(guān)系中依賴(lài)表示兩個(gè)或多個(gè)模型元素之間語(yǔ)義上的關(guān)系。它只將模型元素本身連接起來(lái)而不需要用一組實(shí)例來(lái)表達(dá)它的意思。它表示了這樣一種情形,提供者的某些變化會(huì)要求或指示依賴(lài)關(guān)系中客戶的變化。
5.1依賴(lài)的種類(lèi)
訪問(wèn):允許一個(gè)包訪問(wèn)另一個(gè)包【access】
綁定:為模板參數(shù)賦值以生成一個(gè)新的模型元素【bind】
調(diào)用:聲明一個(gè)類(lèi)調(diào)用其他類(lèi)的方法【call】
導(dǎo)出:聲明一個(gè)實(shí)例可以從另一個(gè)實(shí)例中到處【derive】
友元:允許一個(gè)元素訪問(wèn)另一個(gè)元素而不論被訪問(wèn)元素的可見(jiàn)性【friend】
引入:允許一個(gè)包訪問(wèn)另一個(gè)包的內(nèi)容并未被訪問(wèn)包的組成部分添加別名【import】
實(shí)例化:關(guān)于一個(gè)類(lèi)的方法生成了另一個(gè)類(lèi)的實(shí)例的生命【instantate】
參數(shù):一個(gè)操作和他參數(shù)之間的關(guān)系【parameter】
實(shí)現(xiàn):說(shuō)明和其實(shí)之間的映射關(guān)系【realize】
精化:聲明具有兩個(gè)不同層次上元素的映射關(guān)系【refine】
發(fā)送:信號(hào)發(fā)送者和信號(hào)接受者之間的關(guān)系【send】
跟蹤:聲明不同模型中元素之間的連接,沒(méi)有映射精確【trace】
使用:聲明使用一個(gè)模型元素需要已存在的另一個(gè)模型元素,這樣才能正確實(shí)現(xiàn)使用者的功能(調(diào)用,實(shí)例化,參數(shù),發(fā)送)【use】
6:約束
UML類(lèi)圖關(guān)系中約束可以用來(lái)表示各種非局部的關(guān)系,如關(guān)聯(lián)路徑上的限制。約束尤其可以用來(lái)表述存在特性(存在X則C條件成立)和通用特性(對(duì)于Y中的所有y,條件D必須成立)。
7:實(shí)例
實(shí)例是有身份標(biāo)識(shí)的運(yùn)行實(shí)體,即它可以與其他運(yùn)行實(shí)體相區(qū)分。它在任何時(shí)刻都有一個(gè)值,隨著對(duì)實(shí)例進(jìn)行操作值也會(huì)被改變。
———————————————————————————————————————————————–
類(lèi)與類(lèi)之間存在以下關(guān)系:?
(1)泛化(Generalization)?
(2)關(guān)聯(lián)(Association)?
(3)依賴(lài)(Dependency)?
(4)聚合(Aggregation)?
UML圖與應(yīng)用代碼例子:?
1.泛化(Generalization)?
[泛化]?
表示類(lèi)與類(lèi)之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類(lèi)對(duì)接口的實(shí)現(xiàn)關(guān)系。一般化的關(guān)系是從子類(lèi)指向父類(lèi)的,與繼承或?qū)崿F(xiàn)的方法相反。?
[具體表現(xiàn)]?
父類(lèi) 父類(lèi)實(shí)例=new 子類(lèi)()?
[UML圖](圖1.1)?
圖1.1 Animal類(lèi)與Tiger類(lèi),Dog類(lèi)的泛化關(guān)系?
[代碼表現(xiàn)]?
class Animal{}?
class Tiger extends Animal{}?
public class Test?
{?
public void test()?
{?
Animal a=new Tiger();?
}?
}?
2.依賴(lài)(Dependency)?
[依賴(lài)]?
對(duì)于兩個(gè)相對(duì)獨(dú)立的對(duì)象,當(dāng)一個(gè)對(duì)象負(fù)責(zé)構(gòu)造另一個(gè)對(duì)象的實(shí)例,或者依賴(lài)另一個(gè)對(duì)象的服務(wù)時(shí),這兩個(gè)對(duì)象之間主要體現(xiàn)為依賴(lài)關(guān)系。?
[具體表現(xiàn)]?
依賴(lài)關(guān)系表現(xiàn)在局部變量,方法的參數(shù),以及對(duì)靜態(tài)方法的調(diào)用?
[現(xiàn)實(shí)例子]?
比如說(shuō)你要去擰螺絲,你是不是要借助(也就是依賴(lài))螺絲刀(Screwdriver)來(lái)幫助你完成擰螺絲(screw)的工作?
[UML表現(xiàn)](圖1.2)?
圖1.2 Person類(lèi)與Screwdriver類(lèi)的依賴(lài)關(guān)系?
[代碼表現(xiàn)]?
public class Person{?
/** 擰螺絲 */?
public void screw(Screwdriver screwdriver){?
screwdriver.screw();?
}?
}?
3.關(guān)聯(lián)(Association)?
[關(guān)聯(lián)]?
對(duì)于兩個(gè)相對(duì)獨(dú)立的對(duì)象,當(dāng)一個(gè)對(duì)象的實(shí)例與另一個(gè)對(duì)象的一些特定實(shí)例存在固定的對(duì)應(yīng)關(guān)系時(shí),這兩個(gè)對(duì)象之間為關(guān)聯(lián)關(guān)系。?
[具體表現(xiàn)]?
關(guān)聯(lián)關(guān)系是使用實(shí)例變量來(lái)實(shí)現(xiàn)?
[現(xiàn)實(shí)例子]?
比如客戶和訂單,每個(gè)訂單對(duì)應(yīng)特定的客戶,每個(gè)客戶對(duì)應(yīng)一些特定的訂單;再例如公司和員工,每個(gè)公司對(duì)應(yīng)一些特定的員工,每個(gè)員工對(duì)應(yīng)一特定的公司?
[UML圖] (圖1.3)?
圖1.3 公司和員工的關(guān)聯(lián)關(guān)系?
[代碼表現(xiàn)]?
public class Company{?
private Employee employee;?
public Employee getEmployee(){?
return employee;?
}?
public void setEmployee(Employee employee){?
this.employee=employee;?
}?
//公司運(yùn)作?
public void run(){?
employee.startWorking();?
}?
}?
(4)聚合(Aggregation)?
[聚合]?
當(dāng)對(duì)象A被加入到對(duì)象B中,成為對(duì)象B的組成部分時(shí),對(duì)象B和對(duì)象A之間為聚集關(guān)系。聚合是關(guān)聯(lián)關(guān)系的一種,是較強(qiáng)的關(guān)聯(lián)關(guān)系,強(qiáng)調(diào)的是整體與部分之間的關(guān)系。?
[具體表現(xiàn)]?
與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過(guò)實(shí)例變量來(lái)實(shí)現(xiàn)這樣關(guān)系的。關(guān)聯(lián)關(guān)系和聚合關(guān)系來(lái)語(yǔ)法上是沒(méi)辦法區(qū)分的,從語(yǔ)義上才能更好的區(qū)分兩者的區(qū)別。?
[關(guān)聯(lián)與聚合的區(qū)別]?
(1)關(guān)聯(lián)關(guān)系所涉及的兩個(gè)對(duì)象是處在同一個(gè)層次上的。比如人和自行車(chē)就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因?yàn)槿瞬皇怯勺孕熊?chē)組成的。?
聚合關(guān)系涉及的兩個(gè)對(duì)象處于不平等的層次上,一個(gè)代表整體,一個(gè)代表部分。比如電腦和它的顯示器、鍵盤(pán)、主板以及內(nèi)存就是聚集關(guān)系,因?yàn)橹靼迨请娔X的組成部分。?
(2)對(duì)于具有聚集關(guān)系(尤其是強(qiáng)聚集關(guān)系)的兩個(gè)對(duì)象,整體對(duì)象會(huì)制約它的組成對(duì)象的生命周期。部分類(lèi)的對(duì)象不能單獨(dú)存在,它的生命周期依賴(lài)于整體類(lèi)的 對(duì)象的生命周期,當(dāng)整體消失,部分也就隨之消失。比如張三的電腦被偷了,那么電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤(pán)和內(nèi)存) 拆了下來(lái)。
[UML圖](圖1.4)?
圖1.3 電腦和組件的聚合關(guān)系?
[代碼表現(xiàn)]?
public class Computer{?
private CPU cpu;?
public CPU getCPU(){?
return cpu;?
}?
public void setCPU(CPU cpu){?
this.cpu=cpu;?
}?
//開(kāi)啟電腦?
public void start(){?
//cpu運(yùn)作?
cpu.run();?
}?
}
———————————————————————————————————————————————–
類(lèi)圖及類(lèi)圖中的關(guān)系
1.類(lèi)圖和對(duì)象圖
類(lèi)圖(Class Diagram)是顯示出類(lèi)、接口以及他們之間的靜態(tài)結(jié)構(gòu)與關(guān)系的圖。其中最基本的單元是類(lèi)或接口。
類(lèi)圖不但可以表示類(lèi)(或者接口)之間的關(guān)系,也可以表示對(duì)象之間的關(guān)系。下面是一個(gè)典型的類(lèi)圖:
類(lèi)圖一般分為幾個(gè)部分:類(lèi)名、屬性、方法。下面分別講解。
(1)類(lèi)名
上面的Car就是類(lèi)名,如果類(lèi)名是正體字,則說(shuō)明該類(lèi)是一個(gè)具體的類(lèi),如果類(lèi)名是斜體字,則說(shuō)明類(lèi)是一個(gè)抽象類(lèi)abstract。
(2)屬性列表
屬性可以是public、protected、private。public前面的圖標(biāo)是菱形,protected對(duì)應(yīng)的是菱形加鑰匙,private對(duì)應(yīng)的是菱形加鎖。當(dāng)然,這只是一種表現(xiàn)方式。我是用的是Rational Rose,如果用的是別的軟件,還可能使用+、-、#表示:+代表public、-代表private、#代表protected。
(3)方法列表
方法可以是public、protected、private。public前面的圖標(biāo)是菱形,protected對(duì)應(yīng)的是菱形加鑰匙,private對(duì)應(yīng)的是菱形加鎖。當(dāng)然,這只是一種表現(xiàn)方式。我是用的是Rational Rose,如果用的是別的軟件,還可能使用+、-、#表示:+代表public、-代表private、#代表protected。
對(duì)于靜態(tài)屬性,屬性名會(huì)加上一條下劃線。如上圖所示。
此外,類(lèi)圖既能表示類(lèi)之間的關(guān)系,還能表示對(duì)象之間的關(guān)系。二者的區(qū)別是:對(duì)象圖中對(duì)象名下面會(huì)加上一條下劃線。
2.類(lèi)圖中的關(guān)系
(1)Generalization:泛化、一般化
Generalization表示的是類(lèi)與類(lèi)之間的繼承關(guān)系、接口與接口之間的繼承關(guān)系、類(lèi)與接口之間的實(shí)現(xiàn)關(guān)系。如果體現(xiàn)到Java語(yǔ)言中,那就是反應(yīng)extends和implements關(guān)鍵字。其典型類(lèi)圖如下所示:
(2)Association:關(guān)聯(lián)關(guān)系
關(guān)聯(lián)關(guān)系描述的是類(lèi)與類(lèi)之間的連接,他表示一個(gè)類(lèi)知道另一個(gè)類(lèi)的屬性和方法。關(guān)聯(lián)關(guān)系可以是單向的或者雙向的。在Java語(yǔ)言中,單向的關(guān)聯(lián)關(guān)系是通過(guò)以實(shí)例變量的方式持有被關(guān)聯(lián)對(duì)象的引用來(lái)實(shí)現(xiàn)的。一般來(lái)說(shuō)是不建議使用雙向的關(guān)聯(lián)關(guān)系的。下面舉例介紹單向的關(guān)聯(lián)關(guān)系。
上面的類(lèi)圖表現(xiàn)的是騎手和馬之間的關(guān)系。Rider中有一個(gè)實(shí)例變量類(lèi)型是Horse。
每個(gè)連接都會(huì)有兩個(gè)端點(diǎn),上面的Rider和Horse就是端點(diǎn),且每個(gè)端點(diǎn)都可以有(optional)一個(gè)基數(shù)(multiplicity),表示這個(gè)類(lèi)可以有幾個(gè)實(shí)例。這個(gè)類(lèi)似于數(shù)據(jù)庫(kù)中的1:n、m:n這些關(guān)系。我們可以給上面的例子加上基數(shù):
上面表示的是騎手與馬之間的1對(duì)n關(guān)系。
(3)Aggregation:聚合關(guān)系
聚合關(guān)系是關(guān)聯(lián)關(guān)系的一部分,是非常強(qiáng)的關(guān)聯(lián)關(guān)系。聚合關(guān)系表現(xiàn)的更多的是整體與部分的關(guān)系。例如汽車(chē)和車(chē)門(mén)、發(fā)動(dòng)機(jī)之間的關(guān)系。如圖所示:
與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過(guò)實(shí)例變量實(shí)現(xiàn)的。單純從語(yǔ)法的角度基本上無(wú)法判斷出關(guān)聯(lián)關(guān)系和聚合關(guān)系。
(4)Composition:組合關(guān)系
組合關(guān)系同樣也是關(guān)聯(lián)關(guān)系中的一種,這種關(guān)系是比聚合關(guān)系更加強(qiáng)的關(guān)系。我們前面提到,聚合關(guān)系表現(xiàn)的是整體與部分之間的關(guān)系,組合關(guān)系是在聚合關(guān)系的基礎(chǔ)上,表示不可分割的整體與部分之間的關(guān)系。也就是說(shuō)表示整體的對(duì)象需要負(fù)責(zé)表示部分的對(duì)象的生命周期。
“代表整體的對(duì)象負(fù)責(zé)保持代表部分的對(duì)象的存活,在一些情況下負(fù)責(zé)將代表部分的對(duì)象湮滅掉。代表整體的對(duì)象某些時(shí)候可以將代表部分的對(duì)象傳遞給另外一個(gè)對(duì)象,并由它負(fù)責(zé)代表部分的對(duì)象的生命周期。換言之,代表部分的對(duì)象同一時(shí)刻只能與一個(gè)對(duì)象構(gòu)成組合關(guān)系。并且由后者排他的負(fù)責(zé)其生命周期。”——《Java與模式》
我們以人和手臂的關(guān)系舉例,組合關(guān)系的類(lèi)圖如下:
(5)Dependency:依賴(lài)關(guān)系
依賴(lài)關(guān)系表示一個(gè)類(lèi)依賴(lài)于另一個(gè)類(lèi)的定義。依賴(lài)關(guān)系是單方向的。人吃蘋(píng)果,那么人依賴(lài)蘋(píng)果。類(lèi)圖如下:
一般來(lái)說(shuō),被依賴(lài)的對(duì)象往往是以局部變量、方法參數(shù)的形式存在于來(lái)對(duì)象中,與關(guān)聯(lián)關(guān)系不同,它不會(huì)以成員變量的形式存在于以來(lái)對(duì)象中。這一點(diǎn)值得注意。另外,每一個(gè)依賴(lài)都有一個(gè)名稱(chēng)。上面這個(gè)依賴(lài)關(guān)系的名稱(chēng)就是eats。
以上就是類(lèi)圖和常見(jiàn)的類(lèi)圖之間的關(guān)系。
</div>總結(jié)
以上是生活随笔為你收集整理的(转载)依赖、关联、聚合、组合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Git中rebase的使用
- 下一篇: APP支付之使用ApplePay支付开发