【設計模式】UML類圖及Java的類之間的關系


UML類圖展示

file

設計模式中的對象關系

關聯和依賴的對比

依賴關系  虛線箭頭

依賴是a類成員方法中有b類的屬性,動物新陳代謝方法中有水和空氣的屬性,只有調這個方法的時候,才可能臨時用一下

關聯關系  實線 類與類的連接,(它使一個類知道另一個類的屬性和方法,關聯關系一般用成員變量實現)

關聯是a類中存在b類對象,企鵝類中有氣候類的屬性

組合和聚合的對比

組合關系  實心菱形

組合有相同的生命周期,鳥有翅膀,鳥死了,翅膀不復存在

聚合關系  空心菱形(想象成盤子,盛東西,盤子的多,另一方少)

大雁群有大雁,一直大雁掛了,大雁群不會消失

繼承和實現的對比

繼承    空心三角形實線

實現    空心三角形虛線

(實現接口有兩種方式,一種是棒棒糖的形式,另一種是虛線空心三角形的方式)

代碼實現

依賴

• 依賴關系(Dependency) 是一種使用關系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系。大多數情況下,依 賴關系體現在某個類的方法使用另一個類的對象作為參數。

• 在UML中,依賴關系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。

file

public class Screwdriver {    //螺絲刀,作為人類的工具,是用來被人類使用的
}
public class Person{
       public void screw(Screwdriver src){    //擰螺絲,需使用螺絲刀
       }
}

依賴關系有如下三種情況:
1、A類是B類中的(某中方法的)局部變量;

2、A類是B類方法當中的一個參數;

3、A類向B類發送消息,從而影響B類發生變化;

關聯(Association)

是一種結構關系,說明一個事物的對象與另一個事物的對象相聯系。給定有關聯的兩個類,可以從一個類的對象得到另一個類的對象。關聯有兩元關系和多元關系。兩元關系是指一種一對一的關系,多元關系是一對多或多對一的關系。兩個類之間的簡單關聯表示了兩個同等地位類之間的結構關系。當你想要表示結構化關系時使用關聯。

• 關聯關系(Association) 是類與類之間最常用的一種關系,它是一種結構化關系,用於表示一類對象與另一類對象之間有聯系。

• 在UML類圖中,用實線連接有關聯的對象所對應的類,在使用Java、C#和C++等編程語言實現關聯關系時,通常將一個類的對象作為另一個類的屬性。

• 在使用類圖表示關聯關系時可以在關聯線上標注角色名。

file

分為幾種情況:

雙向關聯

public class Customer  
{  
    private Product[] products;  
    ……  
}  
public class Product  
{  
    private Customer customer;  
    ……  
}  

單向關聯

public class Customer  
{  
    private Address address;  
    ……  
}  
  
public class Address  
{  
    ……  
}  

自關聯

public class Node  
{  
    private Node subNode;  
    ……  
} 

聚合關系(Aggregation)

• 聚合關系(Aggregation) 表示一個整體與部分的關系。通常在定義一個整體類后,再去分析這個整體類的組成結構,從而找出一些成員類,該整體類和成員類之間就形成了聚合 關系。

• 在聚合關系中,成員類是整體類的一部分,即成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。在UML中,聚合關系用帶空心菱形的直線表示。

file

public class Student{
}
public class School{  
       private List<Student> students ;  //學校與學生是聚合關系
}

file

組合關系(Composition)

組合關系(Composition)也表示類之間整體和部分的關系,但是組合關系中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在,部分對象與整體對象之 間具有同生共死的關系。

• 在組合關系中,成員類是整體類的一部分,而且整體類可以控制成員類的生命周期,即成員類的存在依賴於整體類。在UML中,組合關系用帶實心菱形的直線表示。

file

public class Menu{
}
public class Window{
       private List<Menu> menus ;
}

菜單的存在前提是窗口的存在,兩者之間存在很強的擁有關系。且窗口對菜單的生命周期負責,只有在窗口創建之后,菜單才能夠創建,菜單必須在窗口銷毀之前銷毀。因此Window與Menu之間是組合關系。

泛化

• 泛化關系(Generalization)也就是繼承關系,也稱為“is-a-kind-of”關系,泛化關系用於描述父類與子類之間的關系,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛 化關系用帶空心三角形的直線來表示。

• 在代碼實現時,使用面向對象的繼承機制來實現泛化關系,如在Java語言中使用extends關鍵字、在C++/C#中使用冒號“:”來實現。

file

泛化對應Java中繼承關系,即子類繼承父類中出private修飾外的所有東西(變量、方法等)。示例代碼:

public class Animal {
}
public class Tiger extends Animal {
}

在UML當中,對泛化關系有三個要求:
1、子類與父類應該完全一致,父類所具有的屬性、操作,子類應該都有;

2、子類中除了與父類一致的信息以外,還包括額外的信息;

3、可以使用父類的實例的地方,也可以使用子類的實例;

實現關系(Implementation)

• 接口之間也可以有與類之間關系類似的繼承關系和依賴關系,但是接口和類之間還存在一種實現關系(Realization),在這種關系中,類實現了接口,類中的操作實現了接口中所 聲明的操作。在UML中,類與接口之間的實現關系用帶空心三角形的虛線來表示。

file

public interface Vehicle   
{  
    public void move();  
}  
public class Ship implements Vehicle  
{  
    public void move()   
    {  
    ……  
    }  
}  
public class Car implements Vehicle  
{  
    public void move()   
    {  
    ……  
    }  
}  

總結

關於關聯,聚合,組合在實現上並沒有顯著區別,相區別他們只有通過判斷關系雙方之間的實際關系,如關系強弱、創建與銷毀之間有無必要關聯等。
它們的強弱關系是沒有異議的:依賴 < 關聯 < 聚合 < 組合<泛化(繼承)

實現方式區別

(1)依賴關系:關系對象出現在局部變量或者方法的參數里,或者關系類的靜態方法被調用

(2) 關聯關系:關系對象出現在實例變量中

(3) 聚合關系:關系對象出現在實例變量中

(4) 合成關系:關系對象出現在實例變量中

(5) Generalization: extends

(6) 實現: implements

參考:

https://www.cnblogs.com/1446358788-qq/tag/設計模式/default.html?page=4

https://blog.csdn.net/lpjishu/article/details/51491779


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM