UML類圖與類間六種關系表示
1.類與類圖
類封裝了數據和行為,是面向對象的重要組成部分,它是具有相同屬性,操作,關系的對象集合的總稱.
類圖是使用頻率最高的UML圖之一.
類圖用於描述系統中所包含的類以及它們之間的相互關系,幫助開發人員理解系統,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據.
2.類的UML表示方法
在UML類圖中,類使用包含類名,屬性和方法且帶有分隔線的長方形來表示.
(1) 屬性及方法表示形式: 可見性 名稱 : 類型 [=缺省值]
(2) 方法表示形式為: 可見性 方法名([參數名 : 參數類型]): 返回值類型
方法的多個參數間用逗號隔開,無返回值時,其類型為void.
(3) 屬性及方法可見性: public +, private -, protected #, package ~
(4) 接口的表示形式與類類似,區別在於接口名須以尖括號包裹,同時接口無屬性框,可見性只可能為public,這是由接口本身的特性決定的.

3.依賴關系
假設A類的變化引起了B類的變化,則說名B類依賴於A類.
依賴關系是一種使用關系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系.
大多數情況下,依賴關系體現在某個類的方法使用另一個類的對象作為參數.
在UML中,依賴關系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方.
依賴關系有如下三種情況:
(1) A類是B類中的(某中方法的)局部變量;
(2) A類是B類方法當中的一個參數;
(3) A類向B類發送消息,從而影響B類發生變化;

class Car
{
public:
void move() {}
};
class Driver
{
public:
void drive(Car* car)
{
car->move();
}
};
4.泛化關系
泛化關系:A是B和C的父類,B,C具有公共類(父類)A,說明A是B,C的一般化(概括,也稱泛化).
泛化關系也就是繼承關系,也稱為“is-a-kind-of”關系,泛化關系用於描述父類與子類之間的關系,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛化關系用帶空心三角形的直線來表示。

class Person
{
public:
void talk(){}
};
class Teacher : public Person
{
public:
void teach(){}
};
5.關聯關系
關聯關系: 類之間的聯系,如客戶和訂單,每個訂單對應特定的客戶,每個客戶對應一些特定的訂單,再如籃球隊員與球隊之間的關聯.

關聯兩邊的數字表示兩者的關系的限制,是關聯兩者之間的多重性。通常有“*”(表示所有,不限),“1”(表示有且僅有一個),“0...”(表示0個或者多個),“0,1”(表示0個或者一個),“n...m”(表示n到m個都可以),“m...*”(表示至少m個)。
關聯關系(Association) 是類與類之間最常用的一種關系,它是一種結構化關系,用於表示一類對象與另一類對象之間有聯系。
在UML類圖中,用實線連接有關聯的對象所對應的類,在使用Java、C#和C++等編程語言實現關聯關系時,通常將一個類的對象作為另一個類的屬性。
在使用類圖表示關聯關系時可以在關聯線上標注角色名。
(1) 雙向關聯: 默認情況下,關聯是雙向的。

class Customer;
class Product
{
private:
Customer* customer;
};
class Customer
{
private:
std::vector<Product*> products;
};
(2) 單向關聯:類的關聯關系也可以是單向的,單向關聯用帶箭頭的實線表示.

class Address
{
};
class Customer
{
private:
Address* address;
};
(3) 自關聯: 在系統中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關聯關系稱為自關聯。

class Dir
{
private:
Dir* dir;
};
(4) 重數性關聯: 重數性關聯關系又稱為多重性關聯關系,表示一個類的對象與另一個類的對象連接的個數。在UML中多重性關系可以直接在關聯直線上增加一個數字表示與之對應的另一個類的對象的個數。

class Widget
{
private:
View* parent;
};
class View
{
private:
std::vector<Widget*> widgets;
};
重數表示方式
| 0..1 |
另一個類的一個對象與該類沒有關系,或只與一個該類對象有關系 |
| 1..1 或 1 |
另一個類的一個對象只與一個該類對象有關系 |
| 0..* |
另一個類的一個對象與零個或多個該類對象有關系 |
| 1..* |
另一個類的一個對象與一個或多個該類對象有關系 |
| m..n |
另一個類的一個對象與至少m個最多n個該類對象有關系(m<=n) |
6.聚合關系
聚合關系表示的是整體和部分的關系,整體與部分可以分開.通常在定義一個整體類后,再去分析這個整體類的組成結構,從而找出一些成員類,該整體類和成員類之間就形成了聚合關系. 在聚合關系中,成員類是整體類的一部分,即成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在
在UML中,聚合關系用帶空心菱形的直線表示. 如電話機包括一個話筒; 電腦包括鍵盤、顯示器,一台電腦可以和多個鍵盤、多個顯示器搭配,確定鍵盤和顯示器是可以和主機分開的,主機可以選擇其他的鍵盤、顯示器組成電腦.

7. 組合關系
組合關系也是整體與部分的關系,但是整體與部分不可以分開,組合關系中部分和整體具有統一的生存期,一旦整體對象不存在,部分對象也將不存在,部分對象與整體對象之間具有同生共死的關系.因而在組合關系中,成員類是整體類的一部分,而且整體類可以控制成員類的生命周期,即成員類的存在依賴於整體類.
在UML中,組合關系用帶實心菱形的直線表示. 如公司和部門,部門是部分,公司是整體,公司A的財務部不可能和公司B的財務部對換,就是說,公司A不能和自己的財務部分開; 人與人的心臟.

8. 實現關系
實現關系規定接口和實現接口的類,或者接口與構建結構的關系,接口是操作的集合,而這些操作就用於規定類的操作或者構建一種服務。接口之間也可以有與類之間關系類似的繼承關系和依賴關系,但是接口和其實現類之間還存在一種實現關系,在這種關系中,類實現了接口,類中的操作實現了接口中所聲明的操作。接口中定義的操作一般為公用。
在UML中,類與接口之間的實現關系用帶空心三角形的虛線來表示.

9.六種關系之間的區別
類之間的強弱關系為,泛化>實現>組合>聚合>關聯>依賴
(1) 聚合關系與組合關系的區別
聚合關系與組合關系都表示整體與部分的關系,聚合關系如機場與飛機之間的關系,組合關系如大雁與大雁翅膀之間的關系.
聚合關系中,部分對象的生命周期獨立於整體對象的生命周期,或者整體對象消亡后部分對象仍然可以獨立存在,同時在代碼中一般通過整體類的帶參構造方法或Setter方法將部分類對象傳入整體類的對象,UML中表示聚合關系的實線以空心菱形開始.
組合關系中,部分類對象的生命周期由整體對象控制,一旦整體對象消亡,部分類的對象隨即消亡.代碼中一般在整體類的構造方法內創建部分類的對象,UML中表示組合關系的實線以實心菱形開始.
同時在組合關系中,部分類的對象只屬於某一個確定的整體類對象;而在聚合關系中,部分類對象可以屬於一個或多個整體類對象.
設計模式中,代理模式中的代理類對象與被代理類對象即為組合關系;裝飾模式中的裝飾類對象與被裝飾類對象即為聚合關系.
(2) 聚合關系,組合關系與關聯關系的區別
聚合關系,組合關系和關聯關系實質上是對象間的關系(繼承和實現是類與類和類與接口間的關系).
從語意上講,關聯關系中兩種對象間一般是平等的,而聚合和組合則代表整體和部分間的關系.
而聚合與組合的區別主要體現在實現上和生命周期的管理上.
(3) 依賴關系與關聯關系的區別
依賴關系是較弱的關系,一般表現為在局部變量中使用被依賴類的對象,以被依賴類的對象作為方法參數以及使用被依賴類的靜態方法.
而關聯關系是相對較強的關系,一般表現為一個類包含一個類型為另外一個類的屬性.
