類與類圖
類(Class)封裝了數據和行為,是面向對象的重要組成部分,它是具有相同屬性、操作、關系的對象集合的總稱。
在系統中,每個類具有一定的職責,職責指的是類所擔任的任務,即類要完成什么樣的功能,要承擔什么樣的義務。一個類可以有多種職責,設計得好的類一般只有一種職責,在定義類的時候,將類的職責分解成為類的屬性和操作(即方法)。
類的屬性即類的數據職責,類的操作即類的行為職責。
基本元素符號:
1. 類(Classes)
2. 包(Package)
3. 接口(Interface)
類之間的關系
一、關聯關系
關聯關系(Association)是類與類之間最常用的一種關系,它是一種結構化關系,用於表示一類對象與另一類對象之間有聯系。
在UML類圖中,用實線連接有關聯的對象所對應的類,在使用Java、C#和C++等編程語言實現關聯關系時,通常將一個類的對象作為另一個類的屬性。
在使用類圖表示關聯關系時可以在關聯線上標注角色名。
1.關聯關系
public class LoginForm { private JButton loginButton; …… } public class JButton { …… }
2.雙向關聯
默認情況下,關聯是雙向的。
public class Customer { private Product[] products; …… } public class Product { private Customer customer; …… }
3.單向關聯
類的關聯關系也可以是單向的,單向關聯用帶箭頭的實線表示。
public class Customer { private Address address; …… } public class Address { …… }
4.自關聯
在系統中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關聯關系稱為自關聯。
public class Node { private Node subNode; …… }
5.重數性關聯
重數性關聯關系又稱為多重性關聯關系(Multiplicity),表示一個類的對象與另一個類的對象連接的個數。在UML中多重性關系可以直接在關聯直線上增加一個數字表示與之對應的另一個類的對象的個數。
表示方式 | 多重性說明 |
1..1 | 表示另一個類的一個對象只與一個該類對象有關系 |
0..* | 表示另一個類的一個對象與零個或多個該類對象有關系 |
1..* | 表示另一個類的一個對象與一個或多個該類對象有關系 |
0..1 | 表示另一個類的一個對象沒有或只與一個該類對象有關系 |
m..n | 表示另一個類的一個對象與最少m、最多n個該類對象有關系 (m<=n) |
public class Form { private Button buttons[]; …… } public class Button { … }
6.聚合關系
聚合關系(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 { …… }
7.組合關系
組合關系(Composition)也表示類之間整體和部分的關系,但是組合關系中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在,部分對象與整體對象之間具有同生共死的關系。
在組合關系中,成員類是整體類的一部分,而且整體類可以控制成員類的生命周期,即成員類的存在依賴於整體類。在UML中,組合關系用帶實心菱形的直線表示。
public class Head { private Mouth mouth; public Head() { mouth = new Mouth(); } …… } public class Mouth { …… }
8.依賴關系
依賴關系(Dependency)是一種使用關系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系。大多數情況下,依賴關系體現在某個類的方法使用另一個類的對象作為參數。
在UML中,依賴關系用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
public class Driver { public void drive(Car car) { car.move(); } …… } public class Car { public void move() { ...... } …… }
9.泛化關系
泛化關系(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() { …… } }
10.接口與實現關系
接口之間也可以有與類之間關系類似的繼承關系和依賴關系,但是接口和類之間還存在一種實現關系(Realization),在這種關系中,類實現了接口,類中的操作實現了接口中所聲明的操作。在UML中,類與接口之間的實現關系用帶空心三角形的虛線來表示。
public interface Vehicle { public void move(); } public class Ship implements Vehicle { public void move() { …… } } public class Car implements Vehicle { public void move() { …… } }
實例說明
某基於Java語言的C/S軟件需要提供注冊功能,該功能簡要描述如下:
用戶通過注冊界面(RegisterForm)輸入個人信息,用戶點擊“注冊”按鈕后將輸入的信息通過一個封裝用戶輸入數據的對象(UserDTO)傳遞給操作數據庫的數據訪問類(DAO),為了提高系統的擴展性,針對不同的數據庫可能需要提供不同的數據訪問類,因此提供了數據訪問類接口,如IUserDAO,每一個具體數據訪問類都是某一個數據訪問類接口的實現類,如OracleUserDAO就是一個專門用於訪問Oracle數據庫的數據訪問類。
根據以上描述繪制類圖。為了簡化類圖,個人信息僅包括賬號(userAccount)和密碼(userPassword),且界面類無須涉及界面細節元素。