溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

設(shè)計(jì)模式前言——UML類圖

發(fā)布時(shí)間:2020-06-23 21:54:49 來(lái)源:網(wǎng)絡(luò) 閱讀:6998 作者:天山老妖S 欄目:軟件技術(shù)

設(shè)計(jì)模式前言——UML類圖

一、UML類圖

1、類

類(Class)封裝了數(shù)據(jù)和行為,是面向?qū)ο蟮闹匾M成部分,是具有相同屬性、操作、關(guān)系的對(duì)象集合的總稱。在系統(tǒng)中,每個(gè)類都具有一定的職責(zé),職責(zé)指的是類要完成什么樣的功能,要承擔(dān)什么樣的義務(wù)。一個(gè)類可以有多種職責(zé),設(shè)計(jì)得好的類一般只有一種職責(zé)。在定義類的時(shí)候,將類的職責(zé)分解成為類的屬性和操作(即方法)。類的屬性即類的數(shù)據(jù)職責(zé),類的操作即類的行為職責(zé)。設(shè)計(jì)類是面向?qū)ο笤O(shè)計(jì)中最重要的組成部分,也是最復(fù)雜和最耗時(shí)的部分。
在軟件系統(tǒng)運(yùn)行時(shí),類將被實(shí)例化成對(duì)象(Object),對(duì)象對(duì)應(yīng)于某個(gè)具體的事物,是類的實(shí)例(Instance)。
類圖(Class Diagram)使用出現(xiàn)在系統(tǒng)中的不同類來(lái)描述系統(tǒng)的靜態(tài)結(jié)構(gòu),用來(lái)描述不同的類以及它們之間的關(guān)系。
在系統(tǒng)分析與設(shè)計(jì)階段,類通??梢苑譃槿N,分別是實(shí)體類(Entity Class)、控制類(Control Class)和邊界類(Boundary Class)。
實(shí)體類:實(shí)體類對(duì)應(yīng)系統(tǒng)需求中的每個(gè)實(shí)體,它們通常需要保存在永久存儲(chǔ)體中,一般使用數(shù)據(jù)庫(kù)表或文件來(lái)記錄,實(shí)體類既包括存儲(chǔ)和傳遞數(shù)據(jù)的類,還包括操作數(shù)據(jù)的類。實(shí)體類來(lái)源于需求說(shuō)明中的名詞,如學(xué)生、商品等。
控制類:控制類用于體現(xiàn)應(yīng)用程序的執(zhí)行邏輯,提供相應(yīng)的業(yè)務(wù)操作,將控制類抽象出來(lái)可以降低界面和數(shù)據(jù)庫(kù)之間的耦合度??刂祁愐话闶怯蓜?dòng)賓結(jié)構(gòu)的短語(yǔ)(動(dòng)詞+名詞)轉(zhuǎn)化來(lái)的名詞,如增加商品對(duì)應(yīng)有一個(gè)商品增加類,注冊(cè)對(duì)應(yīng)有一個(gè)用戶注冊(cè)類等。
?邊界類:邊界類用于對(duì)外部用戶與系統(tǒng)之間的交互對(duì)象進(jìn)行抽象,主要包括界面類,如對(duì)話框、窗口、菜單等。
在面向?qū)ο蠓治龊驮O(shè)計(jì)的初級(jí)階段,通常首先識(shí)別出實(shí)體類,繪制初始類圖,此時(shí)的類圖也可稱為領(lǐng)域模型,包括實(shí)體類及其它們之間的相互關(guān)系。

2、UML類圖

在UML中,類使用包含類名、屬性和操作且?guī)в蟹指艟€的長(zhǎng)方形來(lái)表示。
設(shè)計(jì)模式前言——UML類圖
類圖分為三層,第一層是類的名稱,如果是抽象類或接口,就用斜體表示,其中接口名稱的上部會(huì)用<<interface>>修飾;第二層是類的成員變量,通常是字段和屬性;第三層是類的成員方法。類的成員變量和成員方法的修飾符分為+、#、-,分別表示public、protected、private。
在UML類圖中,類一般由三部分組成:
(1) 第一部分是類名:每個(gè)類都必須有一個(gè)名字,類名是一個(gè)字符串。
(2) 第二部分是類的屬性(Attributes):屬性是指類的性質(zhì),即類的成員變量。一個(gè)類可以有任意多個(gè)屬性,也可以沒有屬性
UML規(guī)定屬性的表示方式為:
可見性 名稱:類型 [ = 缺省值 ]
其中:
“可見性”表示該屬性對(duì)于類外的元素而言是否可見,包括公有(public)、私有(private)和受保護(hù)(protected)三種,在類圖中分別用符號(hào)+、-和#表示。
“名稱”表示屬性名,用一個(gè)字符串表示。
“類型”表示屬性的數(shù)據(jù)類型,可以是基本數(shù)據(jù)類型,也可以是用戶自定義類型。
“缺省值”是一個(gè)可選項(xiàng),即屬性的初始值。
(3) 第三部分是類的操作(Operations):操作是類的任意一個(gè)實(shí)例對(duì)象都可以使用的行為,是類的成員方法。
UML規(guī)定操作的表示方式為:
可見性 名稱(參數(shù)列表) [ : 返回類型]
其中:
“可見性”的定義與屬性的可見性定義相同。
“名稱”即方法名,用一個(gè)字符串表示。
“參數(shù)列表”表示方法的參數(shù),其語(yǔ)法與屬性的定義相似,參數(shù)個(gè)數(shù)是任意的,多個(gè)參數(shù)之間用逗號(hào)“,”隔開。
“返回類型”是一個(gè)可選項(xiàng),表示方法的返回值類型,依賴于具體的編程語(yǔ)言,可以是基本數(shù)據(jù)類型,也可以是用戶自定義類型,還可以是空類型(void),如果是構(gòu)造方法,則無(wú)返回類型。

二、類間關(guān)系

類之間的關(guān)系種類:Realization(實(shí)現(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)系。

1、依賴關(guān)系

依賴關(guān)系(Dependency)?是一種使用關(guān)系,特定事物的改變有可能會(huì)影響到使用該事物的其他事物,在需要表示一個(gè)事物使用另一個(gè)事物時(shí)使用依賴關(guān)系。大多數(shù)情況下,依賴關(guān)系體現(xiàn)在某個(gè)類的方法使用另一個(gè)類的對(duì)象作為參數(shù)。
關(guān)系:依賴用來(lái)表示兩者之間的依從關(guān)系,表現(xiàn)為use a。

在UML中,依賴關(guān)系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
設(shè)計(jì)模式前言——UML類圖

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ù),箭頭的指向?yàn)檎{(diào)用關(guān)系;依賴關(guān)系除了臨時(shí)知道對(duì)方外,還是“使用”對(duì)方的方法和屬性;

2、實(shí)現(xiàn)關(guān)系

實(shí)現(xiàn)指的是一個(gè)類實(shí)現(xiàn)接口(可以是多個(gè))的功能;實(shí)現(xiàn)是類與接口之間最常見的關(guān)系;C中沒有直接的接口而是通過(guò)在類中定義純虛函數(shù)來(lái)實(shí)現(xiàn)的。
實(shí)現(xiàn)用來(lái)表示類與接口、抽象類與接口之間的關(guān)系,實(shí)現(xiàn)關(guān)系表現(xiàn)為繼承抽象類。
UML圖中實(shí)現(xiàn)使用一條帶有空心三角箭頭的虛線指向接口。
設(shè)計(jì)模式前言——UML類圖

class animal
{
public:
  Roar() =0;
}

class Cat:public animal
{
public:
  Roar(){cout<<”cat”;}
}

class dog:public animal
{
public:
  Roar(){cout<<”cat”;}
}

3、泛化關(guān)系

泛化關(guān)系表現(xiàn)為繼承或?qū)崿F(xiàn)關(guān)系(is a)。具體形式為類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,類對(duì)接口的實(shí)現(xiàn)關(guān)系。
泛化是一種繼承關(guān)系,用來(lái)表示類與類、類與抽象類、抽象類與抽象類、接口與接口之間的關(guān)系,泛化關(guān)系表現(xiàn)為繼承非抽象類。
UML圖中實(shí)現(xiàn)使用一條帶有空心三角箭頭的實(shí)線指向基類。
設(shè)計(jì)模式前言——UML類圖

class shape
{
public:
  Display(){cout<<”shape”;}
}

class rectangle: public shape
{
public:
  Display(){cout<<” rectangle”;}
}

class circle: public shape
{
public:
  Display(){cout<<” circle”;}
}

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

關(guān)聯(lián)(Association)關(guān)系是類與類之間最常用的一種關(guān)系,是一種結(jié)構(gòu)化關(guān)系,用于表示一類對(duì)象與另一類對(duì)象之間有聯(lián)系,如汽車和輪胎、師傅和徒弟、班級(jí)和學(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):兩個(gè)類都知道另一個(gè)類的公共屬性和操作。
單向關(guān)聯(lián):只有一個(gè)類知道另外一個(gè)類的公共屬性和操作。
大多數(shù)關(guān)聯(lián)應(yīng)該是單向的,單向關(guān)系更容易建立和維護(hù),有助于尋找可服用的類。
UML圖中實(shí)現(xiàn)使用一條實(shí)線連接相同或不同類
設(shè)計(jì)模式前言——UML類圖

5、聚合關(guān)系

聚合是關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系。聚合關(guān)系是整體和個(gè)體的關(guān)系。普通關(guān)聯(lián)關(guān)系的兩個(gè)類處于同一層次上,而聚合關(guān)系的兩個(gè)類處于不同的層次,一個(gè)是整體,一個(gè)是部分。同時(shí),是一種弱的“擁有”關(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ū)分。
聚合用來(lái)表示整體與部分的關(guān)系,是一種弱的關(guān)聯(lián)關(guān)系,體現(xiàn)為A可以包含B,但B不一定是A的一部分。
UML圖中實(shí)現(xiàn)使用一條帶有虛心菱形的線來(lái)表示
設(shè)計(jì)模式前言——UML類圖
聚合是關(guān)聯(lián)關(guān)系的一種特例,體現(xiàn)的是整體與部分、擁有的關(guān)系,即has-a的關(guān)系,此時(shí)整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個(gè)整體對(duì)象,也可以為多個(gè)整體對(duì)象共享在UML中,聚合關(guān)系用帶空心菱形的直線表示。例如:汽車發(fā)動(dòng)機(jī)(Engine)是汽車(Car)的組成部分,但是汽車發(fā)動(dòng)機(jī)可以獨(dú)立存在,因此,汽車和發(fā)動(dòng)機(jī)是聚合關(guān)系,
設(shè)計(jì)模式前言——UML類圖
在代碼實(shí)現(xiàn)聚合關(guān)系時(shí),成員對(duì)象通常作為構(gòu)造方法、Setter方法或業(yè)務(wù)方法的參數(shù)注入到整體對(duì)象中。

6、組合關(guān)系

組合是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系強(qiáng)的關(guān)聯(lián)關(guān)系。它要求普通的聚合關(guān)系中代表整體的對(duì)象負(fù)責(zé)代表部分的對(duì)象的生命周期。Composition(組合關(guān)系)是一種強(qiáng)的“擁有”關(guān)系,體現(xiàn)了嚴(yán)格的部分和整體的關(guān)系,部分和整體的生命周期一致。他同樣體現(xiàn)整體與部分間的關(guān)系,但此時(shí)整體與部分是不可分的,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束;比如你和你的大腦,window窗口和frame,在窗口中創(chuàng)建一個(gè)frame時(shí)必須把它附加到窗口上,當(dāng)窗口消失時(shí)frame也就消失了;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語(yǔ)義級(jí)別來(lái)區(qū)分;
關(guān)系:組合用來(lái)表示整體與部分的關(guān)系,是一種強(qiáng)的關(guān)聯(lián)關(guān)系,體現(xiàn)了嚴(yán)格的整體和部分的關(guān)系,整體和部分的生命周期一樣。
UML圖中實(shí)現(xiàn)使用一條帶有實(shí)心菱形的線來(lái)表示
設(shè)計(jì)模式前言——UML類圖
組合也是關(guān)聯(lián)關(guān)系的一種特例,體現(xiàn)的是一種contains-a的關(guān)系,這種關(guān)系比聚合更強(qiáng),也稱為強(qiáng)聚合;他同樣體現(xiàn)整體與部分間的關(guān)系,但此時(shí)整體與部分是不可分的,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束。在UML中,組合關(guān)系用帶實(shí)心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關(guān)系。
設(shè)計(jì)模式前言——UML類圖

7、聚合和組合的區(qū)別

聚合關(guān)系是“has-a”關(guān)系,組合關(guān)系是“contains-a”關(guān)系;聚合關(guān)系表示整體與部分的關(guān)系比較弱,而組合比較強(qiáng);聚合關(guān)系中代表部分事物的對(duì)象與代表聚合事物的對(duì)象的生存期無(wú)關(guān),一旦刪除了聚合對(duì)象不一定就刪除了代表部分事物的對(duì)象。組合中一旦刪除了組合對(duì)象,同時(shí)也就刪除了代表部分事物的對(duì)象。在聚合關(guān)系中,部分可以獨(dú)立于聚合而存在,部分的所有權(quán)也可以由幾個(gè)聚合來(lái)共享,比如打印機(jī)就可以在辦公室內(nèi)被廣大同事共用
聚合和組合的區(qū)別則在語(yǔ)義和實(shí)現(xiàn)上都有差別,組合的兩個(gè)對(duì)象之間其生命期有很大的關(guān)聯(lián),被組合的對(duì)象是在組合對(duì)象創(chuàng)建的同時(shí)或者創(chuàng)建之后創(chuàng)建,在組合對(duì)象銷毀之前銷毀。一般來(lái)說(shuō)被組合對(duì)象不能脫離組合對(duì)象獨(dú)立存在,而且也只能屬于一個(gè)組合對(duì)象,例如一個(gè)文檔的版本,必須依賴于文檔的存在,也只能屬于一個(gè)文檔。聚合則不一樣,被聚合的對(duì)象可以屬于多個(gè)聚合對(duì)象,例如一個(gè)員工可能可以屬于多個(gè)公司
組合關(guān)系也是聚合關(guān)系的一種,是比聚合關(guān)系更強(qiáng)的關(guān)系。組合關(guān)系是不能共享的。例如人有四肢、頭等。
?? 組合表示類之間整體和部分的關(guān)系,組合中部分和整體具有統(tǒng)一的生存周期。一旦整體對(duì)象不存在,部分對(duì)象也將不存在。部分對(duì)象和整體對(duì)象之間具有共生死的感覺。
a、聚合和組合都是一種結(jié)合關(guān)系,只是額外具有整體部分的含義
b、部件的生命周期不同
???? 聚合關(guān)系中,整體不會(huì)擁有部件的生命周期,所以整體刪除時(shí),部件不會(huì)被刪除。再者,多個(gè)整體可以共享同一個(gè)部件
???? 組合關(guān)系中,整體擁有部分的生命周期,所以整體刪除時(shí),部件一定會(huì)跟著刪除。而且,多個(gè)整體不可以同時(shí)間共享一個(gè)部件。
c、聚合關(guān)系是“has-a”關(guān)系,組合關(guān)系是“contain-a”關(guān)系

8、關(guān)聯(lián)和聚合的區(qū)別

關(guān)聯(lián)關(guān)系所涉及的兩個(gè)對(duì)象是處在同一個(gè)層次上的。比如人和自行車就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因?yàn)槿瞬皇亲孕熊嚨慕M成部分。
聚合關(guān)系涉及的兩個(gè)對(duì)象處于不平等的層次上,一個(gè)代表整體,一個(gè)代表部分。比如:電腦和它的顯示器、鍵盤、主板和內(nèi)存就是聚集關(guān)系。
耦合度:泛化=實(shí)現(xiàn)>組合>聚合>關(guān)聯(lián)>依賴

三、UML實(shí)例

設(shè)計(jì)模式前言——UML類圖
車的類圖結(jié)構(gòu)為<<abstract>>,表示車是一個(gè)抽象類;它有兩個(gè)繼承類:小汽車和自行車;它們之間的關(guān)系為實(shí)現(xiàn)關(guān)系,使用帶空心箭頭的虛線表示。
小汽車為與SUV之間是繼承關(guān)系,它們之間的關(guān)系為泛化關(guān)系,使用帶空心箭頭的實(shí)線表示。
小汽車與發(fā)動(dòng)機(jī)之間是組合關(guān)系,使用帶實(shí)心箭頭的實(shí)線表示。
學(xué)生與班級(jí)之間是聚合關(guān)系,使用帶空心箭頭的實(shí)線表示。
學(xué)生與×××之間為關(guān)聯(lián)關(guān)系,使用一根實(shí)線表示。
學(xué)生上學(xué)需要用到自行車,與自行車是一種依賴關(guān)系,使用帶箭頭的虛線表示。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI