圖解UML類與類之間的六中關系
大話設計模式上的一個圖,我用EA畫出來的:
UML中的6大關系相關英文及音標:
UML中的6大關系簡單解釋:
- 關聯:連接模型元素及鏈接實例,用一條實線來表示;
- 依賴:表示一個元素以某種方式依賴于另一個元素,用一條虛線加箭頭來表示;
- 聚合:表示整體與部分的關系,用一條實線加空心菱形來表示;
- 組成:表示整體與部分的有一關系,用一條實線加實心菱形來表示;
- 泛化(繼承):表示一般與特殊的關系,用一條實線加空心箭頭來表示;
- 實現:表示類與接口的關系,用一條虛線加空心箭頭來表示;
注意:泛化關系和實現關系又統稱為一般關系;
總之:一般關系表現為繼承或實現(is a),關聯關系、聚合關系、合成/組合關系表現為成員變量(has a),依賴關系表現為函數中的參數(use a);
UML中的6大關系詳細說明:
1、關聯關系:
含義:類與類之間的連結,關聯關系使一個類知道另外一個類的屬性和方法;通常含有“知道”,“了解”的含義
體現:在C#中,關聯關系是通過成員變量來實現的;
方向:雙向或單向;
圖示:實線 + 箭頭;箭頭指向被關聯的類;
舉例:“漁民”需要知道“天氣”情況才能夠出海
//公司關聯雇員
public class Company
{
private Employee employee;
public Employee GetEmployee()
{
return employee;
}
public void SetEmployee(Employee employee)
{
this.employee = employee;
}
//公司運作
public void Run()
{
employee.StartWorking();
}
}
//A關聯B
class A
{
B b = new B();
}
class B
{
}
它體現的是兩個類、或者類與接口之間語義級別的一種強依賴關系,比如我和我的朋友;這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的、關聯可以是單向、雙向的;表現在代碼層面,為被關聯類B以類屬性的形式出現在關聯類A中,也可能是關聯類A引用了一個類型為被關聯類B的全局變量;
2、依賴關系:
含義:是類與類之間的連接,表示一個類依賴于另外一個類的定義;依賴關系僅僅描述了類與類之間的一種使用與被使用的關系;
體現:在C#中體現為局部變量、方法/函數的參數或者是對靜態方法的調用;
方向:單向;
圖示:虛線 + 箭頭;
舉例:人依賴于水和空氣;汽車依賴汽油
//人劃船,人依賴于船
public class Person
{
//劃船
public void Oarage(Boat boat)
{
boat.Oarage();
}
}
//A依賴于B
class A
{
public void Function(B b)
{ }
}
class B
{
}
可以簡單的理解,就是一個類A使用到了另一個類B,而這種使用關系是具有偶然性的、、臨時性的、非常弱的,但是B類的變化會影響到A;比如某人要過河,需要借用一條船,此時人與船之間的關系就是依賴;表現在代碼層面,為類B作為參數被類A在某個method方法中使用;
3、聚合關系:
含義:是關聯關系的一種,是一種強關聯關系;聚合關系是整體和個體/部分之間的關系;關聯關系的兩個類處于同一個層次上,而聚合關系的兩個類處于不同的層次上,一個是整體,一個是個體/部分;在聚合關系中,代表個體/部分的對象有可能會被多個代表整體的對象所共享;
體現:C++中,聚合關系通過將被聚合者的(數組)指針作為內部成員來實現的;
方向:單向;
圖示:空心菱形 + 實線 + 箭頭;箭頭指向被聚合的類,也就是說,箭頭指向個體/部分;
舉例:鴨群與鴨子具有聚合關系;汽車由引擎、輪胎以及其它零件組成,因為汽車壞掉了,沒有壞掉的引擎,輪胎和其他零件還可以繼續使用。
聚合是關聯關系的一種特例,他體現的是整體與部分、擁有的關系,即has-a的關系,此時整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享;比如計算機與CPU、公司與員工的關系等;表現在代碼層面,和關聯關系是一致的,只能從語義級別來區分;
4、組合關系:
含義:它也是關聯關系的一種,但它是比聚合關系更強的關系.組合關系要求聚合關系中代表整體的對象要負責代表個體/部分的對象的整個生命周期;組合關系不能共享;在組合關系中,如果代表整體的對象被銷毀或破壞,那么代表個體/部分的對象也一定會被銷毀或破壞,而聚在合關系中,代表個體/部分的對象則有可能被多個代表整體的對象所共享,而不一定會隨著某個代表整體的對象被銷毀或破壞而被銷毀或破壞;
體現:在C#中,組合關系是通過成員變量來實現的;
方向:單向;
圖示:實心菱形 + 實線 + 箭頭;箭頭指向代表個體/部分的對象,也就是被組合的類的對象;
舉例:一個人由頭、四肢、等各種器官組成,因為人與這些器官具有相同的生命周期,人死了,這些器官也掛了;
組合也是關聯關系的一種特例,他體現的是一種contains-a的關系,這種關系比聚合更強,也稱為強聚合;他同樣體現整體與部分間的關系,但此時整體與部分是不可分的,整體的生命周期結束也就意味著部分的生命周期結束;比如你和你的大腦;表現在代碼層面,和關聯關系是一致的,只能從語義級別來區分;
5、泛化關系:
含義:它表示一個更泛化的元素和一個更具體的元素之間的關系;也就是通常所說的類的繼承關系;
體現:在C#中,泛化關系通過類的繼承來實現的;
方向:單向;子類繼承父類;
圖示:空心箭頭 + 實線;箭頭指向父類;
舉例:動物下面可以分為哺乳動物,脊椎動物,爬行動物等
指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關系;在Java中此類關系通過關鍵字extends明確標識,在設計時一般沒有爭議性;
6、實現關系:
含義:它指定了兩個實體之間的一份合同;即:一個實體定義一份合同,另外一個實體則保證履行該合同;
體現:在C#中,實現關系通過類實現接口來實現的,即:一個類實現某個接口;
方向:單向;子類實現接口;
圖示:空心箭頭 + 虛線;箭頭指接口向接口;
舉例:唐老鴨(對象)會說話(接口),因為一般鴨子不會說話,所以不會將說話這個方法給一般的鴨子帶上;超人(對象)會飛(接口)
指的是一個class類實現interface接口(可以是多個)的功能;實現是類與接口之間最常見的關系;在Java中此類關系通過關鍵字implements明確標識,在設計時一般沒有爭議性;
總結:對于繼承、實現這兩種關系沒多少疑問,他們體現的是一種類與類、或者類與接口間的縱向關系;其他的四者關系則體現的是類與類、或者類與接口間的引用、橫向關系,是比較難區分的,有很多事物間的關系要想準備定位是很難的,前面也提到,這幾種關系都是語義級別的,所以從代碼層面并不能完全區分各種關系;但總的來說,后幾種關系所表現的強弱程度依次為:組合>聚合>關聯>依賴。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成