ULM圖中類之間的關係:依賴,泛化,關聯,聚合,組合,實現

在UML中,類使用包含類名、屬性和操作且帶有分隔線的長方形來表示,如定義一個Employee類,它包含屬性name、age和email,以及操作modifyInfo()

public class Employee {
    private String name;
    private int age;
    private String email;

    public void modifyInfo() {
        ......
    }
}

 

在UML類圖中,類一般由三部分組成:

(1) 第一部分是類名:每個類都必須有一個名字,類名是一個字符串。

(2) 第二部分是類的屬性(Attributes):屬性是指類的性質,即類的成員變量。一個類可以有任意多個屬性,也可以沒有屬性

UML規定屬性的表示方式爲:

  可見性 名稱:類型 [ = 缺省值 ]

其中:

  • “可見性”表示該屬性對於類外的元素而言是否可見,包括公有(public)私有(private)保護(protected)三種,在類圖中分別用符號 +- 和 # 表示。
  • “名稱”表示屬性名,用一個字符串表示。
  • “類型”表示屬性的數據類型,可以是基本數據類型,也可以是用戶自定義類型。
  • “缺省值”是一個可選項,即屬性的初始值。

(3) 第三部分是類的操作(Operations):操作是類的任意一個實例對象都可以使用的行爲,是類的成員方法。

UML規定操作的表示方式爲:

  可見性 名稱(參數列表) [ : 返回類型]

其中:

  • “可見性”的定義與屬性的可見性定義相同。
  • “名稱”即方法名,用一個字符串表示。
  • “參數列表”表示方法的參數,其語法與屬性的定義相似,參數個數是任意的,多個參數之間用逗號“,”隔開。
  • “返回類型”是一個可選項,表示方法的返回值類型,依賴於具體的編程語言,可以是基本數據類型,也可以是用戶自定義類型,還可以是空類型(void),如果是構造方法,則無返回類型。

在下圖中,操作method1的可見性爲public(+),帶入了一個Object類型的參數par,返回值爲空(void);操作method2的可見性爲protected(#),無參數,返回值爲String類型;操作method3的可見性爲private(-),包含兩個參數,其中一個參數爲int類型,另一個爲int[]類型,返回值爲int類型。

由於在Java語言中允許出現內部類,因此可能會出現包含四個部分的類圖。

類與類圖
1) 類(Class)封裝了數據和行爲,是面向對象的重要組成部分,它是具有相同屬性、操作、關係的對象集合的總稱。
2) 在系統中,每個類具有一定的職責,職責指的是類所擔任的任務,即類要完成什麼樣的功能,要承擔什麼樣的義務。一個類可以有多種職責,設計得好的類一般只有一種職責,在定義類的時候,將類的職責分解成爲類的屬性和操作(即方法)。
3) 類的屬性即類的數據職責,類的操作即類的行爲職責。

 一、依賴關係(Dependence)

依賴關係(Dependence):假設A類的變化引起了B類的變化,則說名B類依賴於A類。

•  依賴關係(Dependency) 是一種使用關係,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關係。大多數情況下,依       賴關係體現在某個類的方法使用另一個類的對象作爲參數。
•   在UML中,依賴關係用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。

public class Driver
{
    public void drive(Car car)
    {
        car.move();
    }
    ……
}
public class Car
{
    public void move()
    {
        ......
    }
    ……
}

依賴關係有如下三種情況:

1、A類是B類中的(某中方法的)局部變量;

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

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

二、泛化關係(Generalization)

泛化關係(Generalization):A是B和C的父類,B,C具有公共類(父類)A,說明A是B,C的一般化(概括,也稱泛化)

•  泛化關係(Generalization)也就是繼承關係,也稱爲“is-a-kind-of”關係,泛化關係用於描述父類與子類之間的關係,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛      化關係用帶空心三角形的直線來表示。
•  在代碼實現時,使用面向對象的繼承機制來實現泛化關係,如在Java語言中使用extends關鍵字、在C++/C#中使用冒號“:”來實現。

public class Person 
{
    protected String name;
    protected int age;
    public void move() 
    {
        ……
    }
    public void say() 
   {
        ……
    }
}
public class Student extends Person 
{
    private String studentNo;
    public void study() 
    {
        ……
    }
}

在UML當中,對泛化關係有三個要求:

1、子類與父類應該完全一致,父類所具有的屬性、操作,子類應該都有;

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

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

 

 三、關聯關係(Association)

關聯關係(Association):類之間的聯繫,如客戶和訂單,每個訂單對應特定的客戶,每個客戶對應一些特定的訂單,再如籃球隊員與球隊之間的關聯(下圖所示)。

其中,關聯兩邊的"employee"和“employer”標示了兩者之間的關係,而數字表示兩者的關係的限制,是關聯兩者之間的多重性。通常有:

“*”(表示所有,不限)

“1”(表示有且僅有一個)

“0...”(表示0個或者多個)

“0,1”(表示0個或者一個)

“n...m”(表示n到m個都可以)

“m...*”(表示至少m個)。

•  關聯關係(Association) 是類與類之間最常用的一種關係,它是一種結構化關係,用於表示一類對象與另一類對象之間有聯繫。
•  在UML類圖中,用實線連接有關聯的對象所對應的類,在使用Java、C#和C++等編程語言實現關聯關係時,通常將一個類的對象作爲另一個類的屬性。
•  在使用類圖表示關聯關係時可以在關聯線上標註角色名。

1)  雙向關聯: 默認情況下,關聯是雙向的。

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

2 ) 單向關聯:類的關聯關係也可以是單向的,單向關聯用帶箭頭的實線表示.

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

3) 自關聯: 在系統中可能會存在一些類的屬性對象類型爲該類本身,這種特殊的關聯關係稱爲自關聯。

public class Node
{
    private Node* subNode;
    ……
} 

4) 重數性關聯: 重數性關聯關係又稱爲多重性關聯關係(Multiplicity),表示一個類的對象與另一個類的對象連接的個數。在UML中多重性關係可以直接在關聯直線上增加一個數字表示與之對應的另一個類的對象的個數。

表示方式 多重性說明
1..1 表示另一個類的一個對象只與一個該類對象有關係
0..* 表示另一個類的一個對象與零個或多個該類對象有關係
1..* 表示另一個類的一個對象與一個或多個該類對象有關係
0..1 表示另一個類的一個對象沒有或只與一個該類對象有關係
m..n

表示另一個類的一個對象與最少m、最多n個該類對象有關係 (m<=n)

 

public class Form
{
    private Button buttons[];
    ……
} 
public class Button
{
    …
}

 四、聚合關係(Aggregation)

聚合關係(Aggregation):表示的是整體和部分的關係,整體與部分 可以分開.

•  聚合關係(Aggregation) 表示一個整體與部分的關係。通常在定義一個整體類後,再去分析這個整體類的組成結構,從而找出一些成員類,該整體類和成員類之間就形成了聚合   關係。
•  在聚合關係中,成員類是整體類的一部分,即成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。在UML中,聚合關係用帶空心菱形的直線表示。

 

public class Car
{
    private Engine engine;
    public Car(Engine engine)
   {
        this.engine = engine;
    }
    
    public void setEngine(Engine engine)
    {
        this.engine = engine;
    }
    ……
}
public class Engine
{
    ……
}

如:

電腦包括鍵盤、顯示器,一臺電腦可以和多個鍵盤、多個顯示器搭配,確定鍵盤和顯示器是可以和主機分開的,主機可以選擇其他的鍵盤、顯示器組成電腦。

 五、組合關係(Composition)

組合關係(Composition):也是整體與部分的關係,但是整體與部分不可以分開.


•  組合關係(Composition)也表示類之間整體和部分的關係,但是組合關係中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在,部分對象與整體對象之    間具有同生共死的關係。
•  在組合關係中,成員類是整體類的一部分,而且整體類可以控制成員類的生命週期,即成員類的存在依賴於整體類。在UML中,組合關係用帶實心菱形的直線表示。

public class Head
{
    private Mouth mouth;
    public Head()
    {
	mouth = new Mouth();
    }
    ……
}
 
public class Mouth
{
    ……
}

如:公司和部門,部門是部分,公司是整體,公司A的財務部不可能和公司B的財務部對換,就是說,公司A不能和自己的財務部分開; 鞋子和鞋底一樣不能分開。

六、實現關係(Implementation)

實現關係(Implementation):是用來規定接口和實線接口的類或者構建結構的關係,接口是操作的集合,而這些操作就用於規定類或者構建的一種服務。


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

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章