UML類圖展示
設計模式中的對象關系
關聯(lián)和依賴的對比
依賴關系 虛線箭頭
依賴是a類成員方法中有b類的屬性,動物新陳代謝方法中有水和空氣的屬性盾戴,只有調這個方法的時候,才可能臨時用一下
關聯(lián)關系 實線 類與類的連接,(它使一個類知道另一個類的屬性和方法,關聯(lián)關系一般用成員變量實現(xiàn))
關聯(lián)是a類中存在b類對象旦万,企鵝類中有氣候類的屬性
組合和聚合的對比
組合關系 實心菱形
組合有相同的生命周期,鳥有翅膀镶蹋,鳥死了纸型,翅膀不復存在
聚合關系 空心菱形(想象成盤子,盛東西梅忌,盤子的多,另一方少)
大雁群有大雁除破,一直大雁掛了牧氮,大雁群不會消失
繼承和實現(xiàn)的對比
繼承 空心三角形實線
實現(xiàn) 空心三角形虛線
(實現(xiàn)接口有兩種方式,一種是棒棒糖的形式瑰枫,另一種是虛線空心三角形的方式)
代碼實現(xiàn)
依賴
? 依賴關系(Dependency) 是一種使用關系踱葛,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系光坝。大多數(shù)情況下尸诽,依 賴關系體現(xiàn)在某個類的方法使用另一個類的對象作為參數(shù)。
? 在UML中盯另,依賴關系用帶箭頭的虛線表示性含,由依賴的一方指向被依賴的一方。
public class Screwdriver { //螺絲刀鸳惯,作為人類的工具商蕴,是用來被人類使用的
}
public class Person{
public void screw(Screwdriver src){ //擰螺絲,需使用螺絲刀
}
}
依賴關系有如下三種情況:
1芝发、A類是B類中的(某中方法的)局部變量绪商;
2、A類是B類方法當中的一個參數(shù)辅鲸;
3格郁、A類向B類發(fā)送消息,從而影響B(tài)類發(fā)生變化独悴;
關聯(lián)(Association)
是一種結構關系例书,說明一個事物的對象與另一個事物的對象相聯(lián)系。給定有關聯(lián)的兩個類刻炒,可以從一個類的對象得到另一個類的對象雾叭。關聯(lián)有兩元關系和多元關系。兩元關系是指一種一對一的關系落蝙,多元關系是一對多或多對一的關系织狐。兩個類之間的簡單關聯(lián)表示了兩個同等地位類之間的結構關系暂幼。當你想要表示結構化關系時使用關聯(lián)。
? 關聯(lián)關系(Association) 是類與類之間最常用的一種關系移迫,它是一種結構化關系旺嬉,用于表示一類對象與另一類對象之間有聯(lián)系。
? 在UML類圖中厨埋,用實線連接有關聯(lián)的對象所對應的類邪媳,在使用Java、C#和C++等編程語言實現(xiàn)關聯(lián)關系時荡陷,通常將一個類的對象作為另一個類的屬性雨效。
? 在使用類圖表示關聯(lián)關系時可以在關聯(lián)線上標注角色名。
分為幾種情況:
雙向關聯(lián)
public class Customer
{
private Product[] products;
……
}
public class Product
{
private Customer customer;
……
}
單向關聯(lián)
public class Customer
{
private Address address;
……
}
public class Address
{
……
}
自關聯(lián)
public class Node
{
private Node subNode;
……
}
聚合關系(Aggregation)
? 聚合關系(Aggregation) 表示一個整體與部分的關系废赞。通常在定義一個整體類后徽龟,再去分析這個整體類的組成結構,從而找出一些成員類唉地,該整體類和成員類之間就形成了聚合 關系据悔。
? 在聚合關系中,成員類是整體類的一部分耘沼,即成員對象是整體對象的一部分极颓,但是成員對象可以脫離整體對象獨立存在。在UML中群嗤,聚合關系用帶空心菱形的直線表示菠隆。
public class Student{
}
public class School{
private List<Student> students ; //學校與學生是聚合關系
}
組合關系(Composition)
組合關系(Composition)也表示類之間整體和部分的關系,但是組合關系中部分和整體具有統(tǒng)一的生存期狂秘。一旦整體對象不存在浸赫,部分對象也將不存在,部分對象與整體對象之 間具有同生共死的關系赃绊。
? 在組合關系中既峡,成員類是整體類的一部分,而且整體類可以控制成員類的生命周期碧查,即成員類的存在依賴于整體類运敢。在UML中,組合關系用帶實心菱形的直線表示忠售。
public class Menu{
}
public class Window{
private List<Menu> menus ;
}
菜單的存在前提是窗口的存在传惠,兩者之間存在很強的擁有關系。且窗口對菜單的生命周期負責稻扬,只有在窗口創(chuàng)建之后卦方,菜單才能夠創(chuàng)建,菜單必須在窗口銷毀之前銷毀泰佳。因此Window與Menu之間是組合關系盼砍。
泛化
? 泛化關系(Generalization)也就是繼承關系尘吗,也稱為“is-a-kind-of”關系,泛化關系用于描述父類與子類之間的關系浇坐,父類又稱作基類或超類睬捶,子類又稱作派生類。在UML中近刘,泛 化關系用帶空心三角形的直線來表示擒贸。
? 在代碼實現(xiàn)時,使用面向對象的繼承機制來實現(xiàn)泛化關系觉渴,如在Java語言中使用extends關鍵字介劫、在C++/C#中使用冒號“:”來實現(xiàn)。
泛化對應Java中繼承關系案淋,即子類繼承父類中出private修飾外的所有東西(變量座韵、方法等)。示例代碼:
public class Animal {
}
public class Tiger extends Animal {
}
在UML當中哎迄,對泛化關系有三個要求:
1、子類與父類應該完全一致隆圆,父類所具有的屬性漱挚、操作,子類應該都有渺氧;
2旨涝、子類中除了與父類一致的信息以外,還包括額外的信息侣背;
3白华、可以使用父類的實例的地方,也可以使用子類的實例履羞;
實現(xiàn)關系(Implementation)
? 接口之間也可以有與類之間關系類似的繼承關系和依賴關系津函,但是接口和類之間還存在一種實現(xiàn)關系(Realization)宏侍,在這種關系中,類實現(xiàn)了接口管搪,類中的操作實現(xiàn)了接口中所 聲明的操作。在UML中铡买,類與接口之間的實現(xiàn)關系用帶空心三角形的虛線來表示更鲁。
public interface Vehicle
{
public void move();
}
public class Ship implements Vehicle
{
public void move()
{
……
}
}
public class Car implements Vehicle
{
public void move()
{
……
}
}
總結
關于關聯(lián),聚合奇钞,組合在實現(xiàn)上并沒有顯著區(qū)別澡为,相區(qū)別他們只有通過判斷關系雙方之間的實際關系,如關系強弱景埃、創(chuàng)建與銷毀之間有無必要關聯(lián)等媒至。
它們的強弱關系是沒有異議的:依賴 < 關聯(lián) < 聚合 < 組合<泛化(繼承)
實現(xiàn)方式區(qū)別
(1)依賴關系:關系對象出現(xiàn)在局部變量或者方法的參數(shù)里顶别,或者關系類的靜態(tài)方法被調用
(2) 關聯(lián)關系:關系對象出現(xiàn)在實例變量中
(3) 聚合關系:關系對象出現(xiàn)在實例變量中
(4) 合成關系:關系對象出現(xiàn)在實例變量中
(5) Generalization: extends
(6) 實現(xiàn): implements
參考:
https://www.cnblogs.com/1446358788-qq/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/default.html?page=4