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) 依賴關係與關聯關係的區別
依賴關係是較弱的關係,一般表現爲在局部變量中使用被依賴類的對象,以被依賴類的對象作爲方法參數以及使用被依賴類的靜態方法.
而關聯關係是相對較強的關係,一般表現爲一個類包含一個類型爲另外一個類的屬性.