1. 程式人生 > >設計模式前言——UML類圖

設計模式前言——UML類圖

類間關系 UML

設計模式前言——UML類圖

一、UML類圖

1、類

類(Class)封裝了數據和行為,是面向對象的重要組成部分,是具有相同屬性、操作、關系的對象集合的總稱。在系統中,每個類都具有一定的職責,職責指的是類要完成什麽樣的功能,要承擔什麽樣的義務。一個類可以有多種職責,設計得好的類一般只有一種職責。在定義類的時候,將類的職責分解成為類的屬性和操作(即方法)。類的屬性即類的數據職責,類的操作即類的行為職責。設計類是面向對象設計中最重要的組成部分,也是最復雜和最耗時的部分。
在軟件系統運行時,類將被實例化成對象(Object),對象對應於某個具體的事物,是類的實例(Instance)。
類圖(Class Diagram)使用出現在系統中的不同類來描述系統的靜態結構,用來描述不同的類以及它們之間的關系。

在系統分析與設計階段,類通常可以分為三種,分別是實體類(Entity Class)、控制類(Control Class)和邊界類(Boundary Class)。
實體類:實體類對應系統需求中的每個實體,它們通常需要保存在永久存儲體中,一般使用數據庫表或文件來記錄,實體類既包括存儲和傳遞數據的類,還包括操作數據的類。實體類來源於需求說明中的名詞,如學生、商品等。
控制類:控制類用於體現應用程序的執行邏輯,提供相應的業務操作,將控制類抽象出來可以降低界面和數據庫之間的耦合度。控制類一般是由動賓結構的短語(動詞+名詞)轉化來的名詞,如增加商品對應有一個商品增加類,註冊對應有一個用戶註冊類等。
?邊界類:邊界類用於對外部用戶與系統之間的交互對象進行抽象,主要包括界面類,如對話框、窗口、菜單等。
在面向對象分析和設計的初級階段,通常首先識別出實體類,繪制初始類圖,此時的類圖也可稱為領域模型,包括實體類及其它們之間的相互關系。

2、UML類圖

在UML中,類使用包含類名、屬性和操作且帶有分隔線的長方形來表示。
技術分享圖片
類圖分為三層,第一層是類的名稱,如果是抽象類或接口,就用斜體表示,其中接口名稱的上部會用<<interface>>修飾;第二層是類的成員變量,通常是字段和屬性;第三層是類的成員方法。類的成員變量和成員方法的修飾符分為+、#、-,分別表示public、protected、private。
在UML類圖中,類一般由三部分組成:
(1) 第一部分是類名:每個類都必須有一個名字,類名是一個字符串。

(2) 第二部分是類的屬性(Attributes):屬性是指類的性質,即類的成員變量。一個類可以有任意多個屬性,也可以沒有屬性
UML規定屬性的表示方式為:
可見性 名稱:類型 [ = 缺省值 ]
其中:
“可見性”表示該屬性對於類外的元素而言是否可見,包括公有(public)、私有(private)和受保護(protected)三種,在類圖中分別用符號+、-和#表示。
“名稱”表示屬性名,用一個字符串表示。
“類型”表示屬性的數據類型,可以是基本數據類型,也可以是用戶自定義類型。
“缺省值”是一個可選項,即屬性的初始值。
(3) 第三部分是類的操作(Operations):操作是類的任意一個實例對象都可以使用的行為,是類的成員方法。
UML規定操作的表示方式為:
可見性 名稱(參數列表) [ : 返回類型]
其中:
“可見性”的定義與屬性的可見性定義相同。
“名稱”即方法名,用一個字符串表示。
“參數列表”表示方法的參數,其語法與屬性的定義相似,參數個數是任意的,多個參數之間用逗號“,”隔開。
“返回類型”是一個可選項,表示方法的返回值類型,依賴於具體的編程語言,可以是基本數據類型,也可以是用戶自定義類型,還可以是空類型(void),如果是構造方法,則無返回類型。

二、類間關系

類之間的關系種類:Realization(實現), Generalization(泛化),Dependency(依賴)、Association(關聯)、Aggregation(聚合)、Composition(組合)。 其中,Aggregation(聚合)、Composition(合成)屬於Association(關聯),是特殊的Association關聯關系。

1、依賴關系

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

在UML中,依賴關系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
技術分享圖片

class channle
{
 public:
   play(){cout<<"play";}
}
class TV
{
  public:
   onplay(channel &chan)
   {
     chan.play();
   }
}

依賴關系有如下三種情況:
(1)類B以參數的形式傳入類A的方法。
(2)類B以局部變量的形式存在於類A的方法中。
(3)類A調用類B的靜態方法。
依賴關系體現為類構造方法及類方法的傳入參數,箭頭的指向為調用關系;依賴關系除了臨時知道對方外,還是“使用”對方的方法和屬性;

2、實現關系

實現指的是一個類實現接口(可以是多個)的功能;實現是類與接口之間最常見的關系;C中沒有直接的接口而是通過在類中定義純虛函數來實現的。
實現用來表示類與接口、抽象類與接口之間的關系,實現關系表現為繼承抽象類。
UML圖中實現使用一條帶有空心三角箭頭的虛線指向接口。
技術分享圖片

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

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

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

3、泛化關系

泛化關系表現為繼承或實現關系(is a)。具體形式為類與類之間的繼承關系,接口與接口之間的繼承關系,類對接口的實現關系。
泛化是一種繼承關系,用來表示類與類、類與抽象類、抽象類與抽象類、接口與接口之間的關系,泛化關系表現為繼承非抽象類。
UML圖中實現使用一條帶有空心三角箭頭的實線指向基類。
技術分享圖片

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

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

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

4、關聯關系

關聯(Association)關系是類與類之間最常用的一種關系,是一種結構化關系,用於表示一類對象與另一類對象之間有聯系,如汽車和輪胎、師傅和徒弟、班級和學生等等。
關聯表現為變量(has a )。
關聯可以是雙向的,也可以是單向的;關聯關系可以進一步劃分為聚合及組合關系。
關聯關系有雙向關聯和單向關聯。
雙向關聯:兩個類都知道另一個類的公共屬性和操作。
單向關聯:只有一個類知道另外一個類的公共屬性和操作。
大多數關聯應該是單向的,單向關系更容易建立和維護,有助於尋找可服用的類。
UML圖中實現使用一條實線連接相同或不同類
技術分享圖片

5、聚合關系

聚合是關聯關系的一種,是強的關聯關系。聚合關系是整體和個體的關系。普通關聯關系的兩個類處於同一層次上,而聚合關系的兩個類處於不同的層次,一個是整體,一個是部分。同時,是一種弱的“擁有”關系。此時整體與部分之間是可分離的,他們可以具有各自的生命周期, 部分可以屬於多個整體對象,也可以為多個整體對象共享;比如計算機與CPU、公司與員工的關系等;表現在代碼層面,和關聯關系是一致的,只能從語義級別來區分。
聚合用來表示整體與部分的關系,是一種弱的關聯關系,體現為A可以包含B,但B不一定是A的一部分。
UML圖中實現使用一條帶有虛心菱形的線來表示
技術分享圖片
聚合是關聯關系的一種特例,體現的是整體與部分、擁有的關系,即has-a的關系,此時整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬於多個整體對象,也可以為多個整體對象共享在UML中,聚合關系用帶空心菱形的直線表示。例如:汽車發動機(Engine)是汽車(Car)的組成部分,但是汽車發動機可以獨立存在,因此,汽車和發動機是聚合關系,
技術分享圖片
在代碼實現聚合關系時,成員對象通常作為構造方法、Setter方法或業務方法的參數註入到整體對象中。

6、組合關系

組合是關聯關系的一種,是比聚合關系強的關聯關系。它要求普通的聚合關系中代表整體的對象負責代表部分的對象的生命周期。Composition(組合關系)是一種強的“擁有”關系,體現了嚴格的部分和整體的關系,部分和整體的生命周期一致。他同樣體現整體與部分間的關系,但此時整體與部分是不可分的,整體的生命周期結束也就意味著部分的生命周期結束;比如你和你的大腦,window窗口和frame,在窗口中創建一個frame時必須把它附加到窗口上,當窗口消失時frame也就消失了;表現在代碼層面,和關聯關系是一致的,只能從語義級別來區分;
關系:組合用來表示整體與部分的關系,是一種強的關聯關系,體現了嚴格的整體和部分的關系,整體和部分的生命周期一樣。
UML圖中實現使用一條帶有實心菱形的線來表示
技術分享圖片
組合也是關聯關系的一種特例,體現的是一種contains-a的關系,這種關系比聚合更強,也稱為強聚合;他同樣體現整體與部分間的關系,但此時整體與部分是不可分的,整體的生命周期結束也就意味著部分的生命周期結束。在UML中,組合關系用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關系。
技術分享圖片

7、聚合和組合的區別

聚合關系是“has-a”關系,組合關系是“contains-a”關系;聚合關系表示整體與部分的關系比較弱,而組合比較強;聚合關系中代表部分事物的對象與代表聚合事物的對象的生存期無關,一旦刪除了聚合對象不一定就刪除了代表部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了代表部分事物的對象。在聚合關系中,部分可以獨立於聚合而存在,部分的所有權也可以由幾個聚合來共享,比如打印機就可以在辦公室內被廣大同事共用
聚合和組合的區別則在語義和實現上都有差別,組合的兩個對象之間其生命期有很大的關聯,被組合的對象是在組合對象創建的同時或者創建之後創建,在組合對象銷毀之前銷毀。一般來說被組合對象不能脫離組合對象獨立存在,而且也只能屬於一個組合對象,例如一個文檔的版本,必須依賴於文檔的存在,也只能屬於一個文檔。聚合則不一樣,被聚合的對象可以屬於多個聚合對象,例如一個員工可能可以屬於多個公司
組合關系也是聚合關系的一種,是比聚合關系更強的關系。組合關系是不能共享的。例如人有四肢、頭等。
?? 組合表示類之間整體和部分的關系,組合中部分和整體具有統一的生存周期。一旦整體對象不存在,部分對象也將不存在。部分對象和整體對象之間具有共生死的感覺。
a、聚合和組合都是一種結合關系,只是額外具有整體部分的含義
b、部件的生命周期不同
???? 聚合關系中,整體不會擁有部件的生命周期,所以整體刪除時,部件不會被刪除。再者,多個整體可以共享同一個部件
???? 組合關系中,整體擁有部分的生命周期,所以整體刪除時,部件一定會跟著刪除。而且,多個整體不可以同時間共享一個部件。
c、聚合關系是“has-a”關系,組合關系是“contain-a”關系

8、關聯和聚合的區別

關聯關系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關聯關系,而不是聚合關系,因為人不是自行車的組成部分。
聚合關系涉及的兩個對象處於不平等的層次上,一個代表整體,一個代表部分。比如:電腦和它的顯示器、鍵盤、主板和內存就是聚集關系。
耦合度:泛化=實現>組合>聚合>關聯>依賴

三、UML實例

技術分享圖片
車的類圖結構為<<abstract>>,表示車是一個抽象類;它有兩個繼承類:小汽車和自行車;它們之間的關系為實現關系,使用帶空心箭頭的虛線表示。
小汽車為與SUV之間是繼承關系,它們之間的關系為泛化關系,使用帶空心箭頭的實線表示。
小汽車與發動機之間是組合關系,使用帶實心箭頭的實線表示。
學生與班級之間是聚合關系,使用帶空心箭頭的實線表示。
學生與×××之間為關聯關系,使用一根實線表示。
學生上學需要用到自行車,與自行車是一種依賴關系,使用帶箭頭的虛線表示。

設計模式前言——UML類圖