UML圖中類之間的關係:依賴,泛化,關聯,聚合,組合,實現
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
- {
- ……
- }
- 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()
- {
- ……
- }
- }