類(Class)封裝了數(shù)據(jù)和行為,是面向?qū)ο蟮闹匾M成部分,是具有相同屬性、操作、關(guān)系的對象集合的總稱。在系統(tǒng)中,每個類都具有一定的職責(zé),職責(zé)指的是類要完成什么樣的功能,要承擔(dān)什么樣的義務(wù)。一個類可以有多種職責(zé),設(shè)計得好的類一般只有一種職責(zé)。在定義類的時候,將類的職責(zé)分解成為類的屬性和操作(即方法)。類的屬性即類的數(shù)據(jù)職責(zé),類的操作即類的行為職責(zé)。設(shè)計類是面向?qū)ο笤O(shè)計中最重要的組成部分,也是最復(fù)雜和最耗時的部分。
在軟件系統(tǒng)運行時,類將被實例化成對象(Object),對象對應(yīng)于某個具體的事物,是類的實例(Instance)。
類圖(Class Diagram)使用出現(xiàn)在系統(tǒng)中的不同類來描述系統(tǒng)的靜態(tài)結(jié)構(gòu),用來描述不同的類以及它們之間的關(guān)系。
在系統(tǒng)分析與設(shè)計階段,類通??梢苑譃槿N,分別是實體類(Entity Class)、控制類(Control Class)和邊界類(Boundary Class)。
實體類:實體類對應(yīng)系統(tǒng)需求中的每個實體,它們通常需要保存在永久存儲體中,一般使用數(shù)據(jù)庫表或文件來記錄,實體類既包括存儲和傳遞數(shù)據(jù)的類,還包括操作數(shù)據(jù)的類。實體類來源于需求說明中的名詞,如學(xué)生、商品等。
控制類:控制類用于體現(xiàn)應(yīng)用程序的執(zhí)行邏輯,提供相應(yīng)的業(yè)務(wù)操作,將控制類抽象出來可以降低界面和數(shù)據(jù)庫之間的耦合度??刂祁愐话闶怯蓜淤e結(jié)構(gòu)的短語(動詞+名詞)轉(zhuǎn)化來的名詞,如增加商品對應(yīng)有一個商品增加類,注冊對應(yīng)有一個用戶注冊類等。
?邊界類:邊界類用于對外部用戶與系統(tǒng)之間的交互對象進(jìn)行抽象,主要包括界面類,如對話框、窗口、菜單等。
在面向?qū)ο蠓治龊驮O(shè)計的初級階段,通常首先識別出實體類,繪制初始類圖,此時的類圖也可稱為領(lǐng)域模型,包括實體類及其它們之間的相互關(guān)系。
在UML中,類使用包含類名、屬性和操作且?guī)в蟹指艟€的長方形來表示。
類圖分為三層,第一層是類的名稱,如果是抽象類或接口,就用斜體表示,其中接口名稱的上部會用<<interface>>修飾;第二層是類的成員變量,通常是字段和屬性;第三層是類的成員方法。類的成員變量和成員方法的修飾符分為+、#、-,分別表示public、protected、private。
在UML類圖中,類一般由三部分組成:
(1) 第一部分是類名:每個類都必須有一個名字,類名是一個字符串。
(2) 第二部分是類的屬性(Attributes):屬性是指類的性質(zhì),即類的成員變量。一個類可以有任意多個屬性,也可以沒有屬性
UML規(guī)定屬性的表示方式為:
可見性 名稱:類型 [ = 缺省值 ]
其中:
“可見性”表示該屬性對于類外的元素而言是否可見,包括公有(public)、私有(private)和受保護(hù)(protected)三種,在類圖中分別用符號+、-和#表示。
“名稱”表示屬性名,用一個字符串表示。
“類型”表示屬性的數(shù)據(jù)類型,可以是基本數(shù)據(jù)類型,也可以是用戶自定義類型。
“缺省值”是一個可選項,即屬性的初始值。
(3) 第三部分是類的操作(Operations):操作是類的任意一個實例對象都可以使用的行為,是類的成員方法。
UML規(guī)定操作的表示方式為:
可見性 名稱(參數(shù)列表) [ : 返回類型]
其中:
“可見性”的定義與屬性的可見性定義相同。
“名稱”即方法名,用一個字符串表示。
“參數(shù)列表”表示方法的參數(shù),其語法與屬性的定義相似,參數(shù)個數(shù)是任意的,多個參數(shù)之間用逗號“,”隔開。
“返回類型”是一個可選項,表示方法的返回值類型,依賴于具體的編程語言,可以是基本數(shù)據(jù)類型,也可以是用戶自定義類型,還可以是空類型(void),如果是構(gòu)造方法,則無返回類型。
類之間的關(guān)系種類:Realization(實現(xiàn)), Generalization(泛化),Dependency(依賴)、Association(關(guān)聯(lián))、Aggregation(聚合)、Composition(組合)。 其中,Aggregation(聚合)、Composition(合成)屬于Association(關(guān)聯(lián)),是特殊的Association關(guān)聯(lián)關(guān)系。
依賴關(guān)系(Dependency)?是一種使用關(guān)系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關(guān)系。大多數(shù)情況下,依賴關(guān)系體現(xiàn)在某個類的方法使用另一個類的對象作為參數(shù)。
關(guān)系:依賴用來表示兩者之間的依從關(guān)系,表現(xiàn)為use a。
在UML中,依賴關(guān)系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
class channle
{
public:
play(){cout<<"play";}
}
class TV
{
public:
onplay(channel &chan)
{
chan.play();
}
}
依賴關(guān)系有如下三種情況:
(1)類B以參數(shù)的形式傳入類A的方法。
(2)類B以局部變量的形式存在于類A的方法中。
(3)類A調(diào)用類B的靜態(tài)方法。
依賴關(guān)系體現(xiàn)為類構(gòu)造方法及類方法的傳入?yún)?shù),箭頭的指向為調(diào)用關(guān)系;依賴關(guān)系除了臨時知道對方外,還是“使用”對方的方法和屬性;
實現(xiàn)指的是一個類實現(xiàn)接口(可以是多個)的功能;實現(xiàn)是類與接口之間最常見的關(guān)系;C中沒有直接的接口而是通過在類中定義純虛函數(shù)來實現(xiàn)的。
實現(xiàn)用來表示類與接口、抽象類與接口之間的關(guān)系,實現(xiàn)關(guān)系表現(xiàn)為繼承抽象類。
UML圖中實現(xiàn)使用一條帶有空心三角箭頭的虛線指向接口。
class animal
{
public:
Roar() =0;
}
class Cat:public animal
{
public:
Roar(){cout<<”cat”;}
}
class dog:public animal
{
public:
Roar(){cout<<”cat”;}
}
泛化關(guān)系表現(xiàn)為繼承或?qū)崿F(xiàn)關(guān)系(is a)。具體形式為類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,類對接口的實現(xiàn)關(guān)系。
泛化是一種繼承關(guān)系,用來表示類與類、類與抽象類、抽象類與抽象類、接口與接口之間的關(guān)系,泛化關(guān)系表現(xiàn)為繼承非抽象類。
UML圖中實現(xiàn)使用一條帶有空心三角箭頭的實線指向基類。
class shape
{
public:
Display(){cout<<”shape”;}
}
class rectangle: public shape
{
public:
Display(){cout<<” rectangle”;}
}
class circle: public shape
{
public:
Display(){cout<<” circle”;}
}
關(guān)聯(lián)(Association)關(guān)系是類與類之間最常用的一種關(guān)系,是一種結(jié)構(gòu)化關(guān)系,用于表示一類對象與另一類對象之間有聯(lián)系,如汽車和輪胎、師傅和徒弟、班級和學(xué)生等等。
關(guān)聯(lián)表現(xiàn)為變量(has a )。
關(guān)聯(lián)可以是雙向的,也可以是單向的;關(guān)聯(lián)關(guān)系可以進(jìn)一步劃分為聚合及組合關(guān)系。
關(guān)聯(lián)關(guān)系有雙向關(guān)聯(lián)和單向關(guān)聯(lián)。
雙向關(guān)聯(lián):兩個類都知道另一個類的公共屬性和操作。
單向關(guān)聯(lián):只有一個類知道另外一個類的公共屬性和操作。
大多數(shù)關(guān)聯(lián)應(yīng)該是單向的,單向關(guān)系更容易建立和維護(hù),有助于尋找可服用的類。
UML圖中實現(xiàn)使用一條實線連接相同或不同類
聚合是關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系。聚合關(guān)系是整體和個體的關(guān)系。普通關(guān)聯(lián)關(guān)系的兩個類處于同一層次上,而聚合關(guān)系的兩個類處于不同的層次,一個是整體,一個是部分。同時,是一種弱的“擁有”關(guān)系。此時整體與部分之間是可分離的,他們可以具有各自的生命周期, 部分可以屬于多個整體對象,也可以為多個整體對象共享;比如計算機(jī)與CPU、公司與員工的關(guān)系等;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語義級別來區(qū)分。
聚合用來表示整體與部分的關(guān)系,是一種弱的關(guān)聯(lián)關(guān)系,體現(xiàn)為A可以包含B,但B不一定是A的一部分。
UML圖中實現(xiàn)使用一條帶有虛心菱形的線來表示
聚合是關(guān)聯(lián)關(guān)系的一種特例,體現(xiàn)的是整體與部分、擁有的關(guān)系,即has-a的關(guān)系,此時整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享在UML中,聚合關(guān)系用帶空心菱形的直線表示。例如:汽車發(fā)動機(jī)(Engine)是汽車(Car)的組成部分,但是汽車發(fā)動機(jī)可以獨立存在,因此,汽車和發(fā)動機(jī)是聚合關(guān)系,
在代碼實現(xiàn)聚合關(guān)系時,成員對象通常作為構(gòu)造方法、Setter方法或業(yè)務(wù)方法的參數(shù)注入到整體對象中。
組合是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系強(qiáng)的關(guān)聯(lián)關(guān)系。它要求普通的聚合關(guān)系中代表整體的對象負(fù)責(zé)代表部分的對象的生命周期。Composition(組合關(guān)系)是一種強(qiáng)的“擁有”關(guān)系,體現(xiàn)了嚴(yán)格的部分和整體的關(guān)系,部分和整體的生命周期一致。他同樣體現(xiàn)整體與部分間的關(guān)系,但此時整體與部分是不可分的,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束;比如你和你的大腦,window窗口和frame,在窗口中創(chuàng)建一個frame時必須把它附加到窗口上,當(dāng)窗口消失時frame也就消失了;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語義級別來區(qū)分;
關(guān)系:組合用來表示整體與部分的關(guān)系,是一種強(qiáng)的關(guān)聯(lián)關(guān)系,體現(xiàn)了嚴(yán)格的整體和部分的關(guān)系,整體和部分的生命周期一樣。
UML圖中實現(xiàn)使用一條帶有實心菱形的線來表示
組合也是關(guān)聯(lián)關(guān)系的一種特例,體現(xiàn)的是一種contains-a的關(guān)系,這種關(guān)系比聚合更強(qiáng),也稱為強(qiáng)聚合;他同樣體現(xiàn)整體與部分間的關(guān)系,但此時整體與部分是不可分的,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束。在UML中,組合關(guān)系用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關(guān)系。
聚合關(guān)系是“has-a”關(guān)系,組合關(guān)系是“contains-a”關(guān)系;聚合關(guān)系表示整體與部分的關(guān)系比較弱,而組合比較強(qiáng);聚合關(guān)系中代表部分事物的對象與代表聚合事物的對象的生存期無關(guān),一旦刪除了聚合對象不一定就刪除了代表部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了代表部分事物的對象。在聚合關(guān)系中,部分可以獨立于聚合而存在,部分的所有權(quán)也可以由幾個聚合來共享,比如打印機(jī)就可以在辦公室內(nèi)被廣大同事共用
聚合和組合的區(qū)別則在語義和實現(xiàn)上都有差別,組合的兩個對象之間其生命期有很大的關(guān)聯(lián),被組合的對象是在組合對象創(chuàng)建的同時或者創(chuàng)建之后創(chuàng)建,在組合對象銷毀之前銷毀。一般來說被組合對象不能脫離組合對象獨立存在,而且也只能屬于一個組合對象,例如一個文檔的版本,必須依賴于文檔的存在,也只能屬于一個文檔。聚合則不一樣,被聚合的對象可以屬于多個聚合對象,例如一個員工可能可以屬于多個公司
組合關(guān)系也是聚合關(guān)系的一種,是比聚合關(guān)系更強(qiáng)的關(guān)系。組合關(guān)系是不能共享的。例如人有四肢、頭等。
?? 組合表示類之間整體和部分的關(guān)系,組合中部分和整體具有統(tǒng)一的生存周期。一旦整體對象不存在,部分對象也將不存在。部分對象和整體對象之間具有共生死的感覺。
a、聚合和組合都是一種結(jié)合關(guān)系,只是額外具有整體部分的含義
b、部件的生命周期不同
???? 聚合關(guān)系中,整體不會擁有部件的生命周期,所以整體刪除時,部件不會被刪除。再者,多個整體可以共享同一個部件
???? 組合關(guān)系中,整體擁有部分的生命周期,所以整體刪除時,部件一定會跟著刪除。而且,多個整體不可以同時間共享一個部件。
c、聚合關(guān)系是“has-a”關(guān)系,組合關(guān)系是“contain-a”關(guān)系
關(guān)聯(lián)關(guān)系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因為人不是自行車的組成部分。
聚合關(guān)系涉及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。比如:電腦和它的顯示器、鍵盤、主板和內(nèi)存就是聚集關(guān)系。
耦合度:泛化=實現(xiàn)>組合>聚合>關(guān)聯(lián)>依賴
車的類圖結(jié)構(gòu)為<<abstract>>,表示車是一個抽象類;它有兩個繼承類:小汽車和自行車;它們之間的關(guān)系為實現(xiàn)關(guān)系,使用帶空心箭頭的虛線表示。
小汽車為與SUV之間是繼承關(guān)系,它們之間的關(guān)系為泛化關(guān)系,使用帶空心箭頭的實線表示。
小汽車與發(fā)動機(jī)之間是組合關(guān)系,使用帶實心箭頭的實線表示。
學(xué)生與班級之間是聚合關(guān)系,使用帶空心箭頭的實線表示。
學(xué)生與×××之間為關(guān)聯(lián)關(guān)系,使用一根實線表示。
學(xué)生上學(xué)需要用到自行車,與自行車是一種依賴關(guān)系,使用帶箭頭的虛線表示。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站名稱:設(shè)計模式前言——UML類圖-創(chuàng)新互聯(lián)
當(dāng)前地址:http://jinyejixie.com/article36/dpsgpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、靜態(tài)網(wǎng)站、App開發(fā)、網(wǎng)站內(nèi)鏈、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容