http://blog.sina.com.cn/s/blog_5ea0192f0100dyvr.html原 文作者不詳細,特此致謝! 在UML類圖中的關係模式主要有以下幾種: 泛化(Generalization), 實現(Realization), 關聯(Association), 彙總(Aggregation), 依賴(Dependency) 等.
1. 泛化(Generalization)
泛化關係: 是一種繼承關係, 表示一般與特殊的關係, 它指定了子類如何特化父類的所有特徵和行為. 老虎是動物的一種, 即有老虎的特性也有動物的共性. 見:
用代碼錶示如下:
程式碼
// Animal.h
class CAnimal
{
public:
// implement
virtual HRESULT EatSomething()
{
// Do something
}
};
// Tiger.h
#include "Animal.h"
class CTiger : public CAnimal
{
// Do something
};
2. 實現(Realization)
實現關係: 是一種類與介面的關係, 表示類是介面所有特徵和行為的實現. 見:
用 代碼錶示如下:
程式碼
// Animal.h
class CAnimal
{
public:
// interface
virtual HRESULT EatSomething() = 0;
};
// Tiger.h
#include "Animal.h"
class CTiger : public CAnimal
{
// Do something
};
注: 泛化和實現的區別就在於子類是否繼承了父類的實現, 如有繼承則關係為泛化, 反之為實現.
3. 關聯(Association)
關 聯關係: 是一種擁有的關係, 可以分為雙向關聯, 單向關聯和自身關聯.
雙向關聯是指雙方都擁有對方的引用, 都可以調用對方的公用屬性和方法. 見:
用 代碼錶示如下:
程式碼
// Husband.h
#include "wife.h"
class CHusband
{
public:
CWife* pWife;
};
// Wife.h
#include "Husband.h"
class CWife
{
public:
CHusband* pHuband;
};
中丈夫和妻子是比較公平的關係, 都可以使用對方公用的屬性.
單向關聯是指 只有某一方擁有另一方的引用, 這樣只有擁有對方者可以調用對方的公用屬性和方法. 如:
用 代碼錶示如下:
程式碼
// Husband.h
class CHusband
{
public:
int nMoney;
void GoShopping();
};
// Wife.h
#include "Husband.h"
class CWife
{
public:
CHusband* pHuband;
};
中妻子擁有 丈夫, 可以使用對方的屬性, 比如錢, 可以讓對方做能做的事, 比如去買東西.
自身關聯是指擁有一個自身的引用. 如
用代碼錶示如下:
程式碼
// SingleMan.h
class CSingleMan
{
public:
CSingleMan *pSingleMan;
};
4. 彙總(Aggregation)和組合(Composition)
彙總關 系: 是整體與部分的關係, 且部分可以離開整體而單獨存在. 如車和輪胎是整體和部分的關係, 輪胎離開車仍然可以存在.
組合關係: 是整體與部分的關係, 但部分不能離開整體而單獨存在. 如公司和部門是整體和部分的關係, 沒有公司就不存在部門.
用代碼錶示如下:
程式碼
// Car.h
#include "Tyre.h"
class CCar
{
public:
CTyre cTyre;
};
// Tyre.h
#include "Car.h"
class CTyre
{
// Do something
};
程式碼
// Company.h
#include "Department.h"
class CCompany
{
public:
CDepartment cDepartment;
};
// Tyre.h
#include "Company.h"
class CDepartment
{
// Do something
};
5. 依賴(Dependency)
依賴關係: 是一種使用的關係, 即一個類的實現需要另一個類的協助, 所以要盡量不使用雙向的互相依賴. 如:
用 代碼錶示如下:
程式碼
// Car.h
class CCar
{
// Do something
};
// Person.h
#include "Car.h"
class CPerson
{
void MoveFast(CCar &pCar);
};
中人的快速移動需要有車的協助, 但是這種依賴是比較弱的, 就是人也可以不用車而用其他工具, 與關聯不同的是人不必擁有這輛車只要使用就行.
這是我得出的耦合強度:(不一定正確)
依賴(dependency) -- 關聯(association) -- 彙總(aggregate) -- 組合(composition) -- 泛化(generalization)
//////////////////////////////////////////////////////////////////////////////////////////
關聯、組合、彙總、依賴關係比較
類之間的關係種類: Generalization(泛化),Dependency(依賴關係)、Association(關聯關係)、Aggregation(彙總關係)、 Composition(合成關係)。
其中Aggregation(彙總關係)、Composition(合成關係)屬於Association(關聯關係),是特殊的Association 關聯關係。Generalization(泛化)表現為繼承或實現關係(is a)。具體形式為類與類之間的繼承關係,介面與介面之間的繼承關係,類對介面的實現關係。
Association關聯絡表現為變數(has a )。類與類之間的聯結,它使一個類知道另一個類的屬性和方法。例如如果A依賴於B,則B體現為A的全域變數。關聯關係有雙向關聯和單向關聯。雙向關聯:兩 個類都知道另一個類的公用屬性和操作。單向關聯:只有一個類知道另外一個類的公用屬性和操作。大多數關聯應該是單向的,單向關係更容易建立和維護,有助於 尋找可服用的類。
Aggregat ion(彙總關係) 是關聯關係的一種,是強的關聯關係。彙總關係是整體和個體的關係。普通關聯關係的兩個類處於同一層次上,而彙總關係的兩個類處於不同的層次,一個是整體, 一個是部分。同時,是一種弱的“擁有”關係。體現的是A對象可以包含B對象,但B對象不是A對象的組成部分。具體表現為,如果A由B彙總成,表現為A包含 有B的全域對象,但是B對象可以不在A建立的時刻建立。
Composition(組合關係)是關聯關係的一種,是比彙總關係強的關係。它要求普通的彙總關係中代表整體的對象負責代表部分的對象的生命週期。 Composition(組合關係)是一種強的“擁有”關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一致。如果A由B組成,表現為A包含有 B的全域對象,並且B對象在A建立的時刻建立。
Dependency(依 賴關係)表現為函數中的參數(use a)。是類與類之間的串連,表示一個類依賴於另一個類的定義,其中一個類的變化將影響另外一個類。例如如果A依賴於B,則B體現為局部變數,方法的參數、 或靜態方法的調用。