目錄
一、UML的構成
1.1 事物
1.2 關系
1.3 圖
二、事物
2.1 結構事物
2.1.1 類(class)
2.1.2 接口
2.1.3 協作
2.1.4 用例
2.1.5 主動類
2.1.6 構件
2.1.7 節點
2.2 行為事物
2.2.1 交互
2.2.2 狀態機
2.2.3 活動
2.3 分組事物
包
2.4 注釋事物
三、關系
3.1 依賴關系
3.2 關聯關系
3.3 泛化關系
3.4 實現關系
四、公共機制
學些UML,首先要知道,UML包括哪些主要構成元素。
建議大家收藏本文,后續我會補畫例子的圖示,一站式學習。????????
一、UML的構成
UML的構成包括了事物、關系和圖三個部分。以下是它們的詳細解釋:
1.1 事物
UML中的事物也稱為建模元素,包括結構事物、行為事物、分組事物和注釋事物。
- 結構事物:描述系統中靜態結構的元素,包括類、接口、協作、用例、主動類、節點和組件等。
- 行為事物:描述系統中動態行為的元素,包括狀態機和交互等。
- 分組事物:描述如何將一組結構事物和行為事物組織在一起,形成一個更大的單位,這就是包。
- 注釋事物:用于對模型中的元素進行解釋和說明,這就是注釋。
1.2 關系
UML中的關系描述了事物之間的聯系,包括關聯關系、泛化關系、實現關系和依賴關系。
- 關聯關系:描述兩個類之間的結構關系,包括聚合和組合兩種形式。
- 泛化關系:描述類之間的繼承關系,表示一個類是另一個類的特殊情況或類型。
- 實現關系:描述類實現接口的情況。
- 依賴關系:描述兩個模型元素之間的語義關系,其中一個元素(獨立元素)發生變化會影響另一個元素(依賴元素)的語義。
1.3 圖
UML中的圖描述了系統的一個方面或視角,包括靜態圖和動態圖兩種。
- 靜態圖:包括類圖、對象圖、包圖、組件圖和部署圖等,用于描述系統的靜態結構。
- 動態圖:包括用例圖、活動圖、狀態圖、交互圖(包括順序圖、通信圖和時序圖)等,用于描述系統的動態行為。
以上就是UML的構成部分及其解釋。這些元素共同構成了UML的基礎,使得我們可以使用UML對軟件進行建模和分析。
如果只想了解大概,那么上面就是核心干貨了。如果想具體了解,請繼續閱讀。
二、事物
2.1 結構事物
2.1.1 類(class)
在UML中,類是一種基本的建模元素,它描述了具有相同屬性、操作、關系和語義的一組對象的集合。類定義了一組對象的所有屬性和行為。
類的定義通常包括以下幾個部分:
- 類名:用于標識類的名稱,通常采用駝峰命名法。
- 屬性:類的屬性描述了類的狀態,即對象所包含的數據。每個屬性都有一個名稱、類型和可見性(如公有、私有或受保護的)。
- 操作:類的操作描述了類可以執行的行為,即對象的方法或函數。每個操作都有一個名稱、參數列表和返回類型。操作也可以具有可見性。
- 關系:類可以與其他類建立關系,如關聯關系、泛化關系、實現關系和依賴關系。這些關系描述了類之間的交互和聯系。
例如,考慮一個簡單的“狗”類,它可能具有以下定義:
類名:Dog
屬性:
- name (String): 狗的名字
- age (int): 狗的年齡
- breed (String): 狗的品種
操作:
- bark(): 狗叫
- run(): 狗跑
- eat(food: Food): 狗吃食物
這個“狗”類定義了一個具有三個屬性和三個操作的類。在實際編程中,這個類可以被實例化為一個或多個“狗”對象,每個對象都具有自己的屬性和行為。
在UML類圖中,類通常用一個矩形表示,類名放在矩形的頂部,屬性和操作分別放在矩形的中部和底部。屬性和操作之前可以加上可見性修飾符(+ 表示公有,- 表示私有,# 表示受保護的)。關系通常用線連接相關的類,并在線上標上關系的名稱。
2.1.2 接口
在UML中,接口(Interface)是一種特殊的類,它定義了一組操作的規范,但沒有實現這些操作。接口描述了類應該具備的行為,但并不關心如何實現這些行為。接口定義了一種契約,規定了類必須遵守的行為規則。
接口的定義通常包括以下幾個部分:
- 接口名:用于標識接口的名稱,通常采用駝峰命名法。
- 操作:接口的操作是它所定義的一組方法或函數的集合。每個操作都有一個名稱、參數列表和返回類型。與類不同,接口只定義操作的簽名,而不提供具體的實現。
例如,考慮一個簡單的“可繪制”接口,它可能具有以下定義:
接口名:Drawable
操作:
- draw(): 繪制對象
這個“可繪制”接口定義了一個具有一個操作的接口,即“繪制對象”。任何實現了這個接口的類都必須提供“draw()”方法的具體實現。
在實際編程中,接口可以被類實現(implement),這意味著類必須提供接口中定義的所有操作的具體實現。一個類可以實現多個接口,這意味著它需要提供多個接口中定義的操作的實現。
在UML類圖中,接口通常用一個帶有《interface》標簽的矩形表示,接口名放在矩形的頂部,操作列在矩形的底部。與類不同,接口沒有屬性部分。實現關系通常用一條帶有虛線的線連接實現接口的類和接口本身,線上標上“implements”或“<<realize>>”等關鍵字。
使用接口的好處之一是它們提供了一種抽象層,允許不同的類實現相同的接口,從而實現多態性。這意味著可以使用相同的接口引用不同的對象,并在運行時確定實際執行的操作。這種靈活性使得接口成為面向對象編程中一種重要的工具,用于定義和擴展系統的行為。
2.1.3 協作
在UML中,協作(Collaboration)是指多個類、接口或其他建模元素之間為了完成特定任務而進行的交互和合作。協作描述了不同建模元素之間的關系以及它們在實現共同目標時的行為。
協作的定義通常包括以下幾個部分:
- 參與者:協作涉及多個參與者,這些參與者可以是類、接口、對象或其他建模元素。每個參與者在協作中扮演特定的角色,并與其他參與者進行交互。
- 交互:協作中的交互是指參與者之間傳遞消息、調用操作或共享信息的過程。這些交互可以是同步的或異步的,并且可以包括各種行為,如方法的調用、事件的觸發或數據的傳遞。
- 關系:協作中的關系描述了參與者之間的聯系和依賴。這些關系可以是關聯關系、泛化關系、實現關系、依賴關系或其他UML定義的關系。關系定義了參與者之間如何進行交互和合作。
- 場景:協作通常發生在特定的場景中,即一組特定的條件和環境下。場景描述了協作發生的原因、參與者的狀態以及它們之間的交互序列。
例如,考慮一個簡單的在線購物系統,其中包括顧客、購物車和訂單等類。在這個系統中,顧客可以將商品添加到購物車中,然后將購物車中的商品生成訂單。這個過程涉及多個類之間的協作。
參與者:
- 顧客(Customer):表示系統中的用戶,具有瀏覽商品、添加商品到購物車和生成訂單等行為。
- 購物車(ShoppingCart):表示顧客的購物車,具有添加商品、移除商品和計算總價等行為。
- 訂單(Order):表示顧客生成的訂單,具有保存訂單信息和處理支付等行為。
交互:
- 顧客瀏覽商品并將選中的商品添加到購物車中。
- 顧客將購物車中的商品生成訂單。
- 訂單處理支付并保存訂單信息。
關系:
- 顧客與購物車之間存在關聯關系,顧客可以擁有多個購物車,但每個購物車只能屬于一個顧客。
- 購物車與訂單之間存在泛化關系,訂單是購物車的特化形式,繼承了購物車的一些屬性和行為。
這個簡單的在線購物系統示例展示了類之間的協作,描述了它們在完成購物過程中的交互和合作方式。在實際的UML建模中,可以使用順序圖、通信圖或活動圖等來可視化和描述協作的詳細過程。
UML中的協作描述了多個建模元素之間為了完成特定任務而進行的交互和合作,它涉及參與者、交互、關系和場景等元素。通過理解和建模協作,可以更好地理解系統的動態行為并設計有效的軟件解決方案。
2.1.4 用例
在UML中,用例(Use Case)是一種描述系統功能的模型元素,它代表了一個系統、子系統或類與外部用戶或其他系統之間的交互行為。用例捕獲了系統應該執行的功能性需求,并描述了系統如何與外部實體進行交互以實現這些功能。
用例的定義通常包括以下幾個部分:
- 用例名:用于標識用例的名稱,應該簡潔明了地描述用例的主要功能。
- 參與者:與用例進行交互的外部實體,可以是用戶、其他系統或硬件設備。參與者描述了與用例相關的角色和責任。
- 前置條件:執行用例之前必須滿足的條件或狀態。這些條件限制了用例的執行,并確保在執行用例之前系統處于適當的狀態。
- 主成功場景:描述了用例的主要成功路徑,即正常情況下用例的執行過程。主成功場景應該清晰地描述參與者與系統之間的交互步驟和結果。
- 擴展和異常場景:描述了用例的擴展路徑和異常情況下的執行過程。這些情況包括錯誤處理、異常輸入或異常狀態等。擴展和異常場景提供了對主成功場景的補充和異常情況的處理方式。
例如,考慮一個簡單的在線圖書館系統,其中包括用戶登錄、瀏覽書籍、借閱書籍和歸還書籍等功能。下面是一個關于“借閱書籍”功能的用例示例:
用例名:借閱書籍
參與者:圖書館用戶
前置條件:用戶必須已經登錄并且具有借閱權限。
主成功場景:
- 用戶選擇想要借閱的書籍。
- 系統檢查書籍的可用性和用戶的借閱權限。
- 如果書籍可用且用戶有權限,系統將書籍狀態更新為“已借出”,并將借閱信息保存到用戶的借閱記錄中。
- 系統顯示借閱成功的消息。
擴展和異常場景:
- 如果書籍不可用,系統顯示書籍不可借的消息,并允許用戶選擇其他書籍。
- 如果用戶沒有借閱權限,系統顯示權限不足的消息,并終止借閱流程。
這個示例展示了用例如何描述系統的功能性和交互行為。通過定義用例,我們可以更好地理解系統的需求和行為,并在設計和開發過程中確保滿足用戶的期望和需求。在實際的UML建模中,可以使用用例圖來可視化和組織用例之間的關系,以便更好地理解和溝通系統的功能需求。
2.1.5 主動類
在UML中,主動類(Active Class)是一種具有生命周期并能主動啟動和控制其行為的類。它描述了對象具有并發行為和獨立控制流的情況。主動類具有與傳統類相似的結構,但它們能夠接收和處理事件,擁有自身的線程,并與其他主動類進行并發交互。
主動類的定義通常包括以下幾個部分:
- 類名和屬性:主動類具有與傳統類相同的類名和屬性定義。它們可以包含狀態信息和其他數據成員。
- 行為:主動類的行為由其操作(方法)和狀態機來描述。操作定義了主動類可以執行的行為,而狀態機描述了主動類在不同狀態下的行為以及狀態之間的轉換。
- 并發性:主動類具有并發性特征,它們可以創建自己的線程并在執行過程中與其他線程進行交互。這意味著主動類的對象可以在同一時間內執行多個操作。
- 事件處理:主動類能夠接收和處理外部事件。當事件發生時,主動類的對象會觸發相應的操作或狀態轉換來響應事件。
例如,考慮一個簡單的電梯控制系統,其中電梯是一個主動類。每個電梯對象具有自身的狀態(如開門、關門、上升、下降等),并且能夠響應乘客的按鈕按下事件。
類名:Elevator
屬性:
- currentFloor:當前所在樓層
- targetFloor:目標樓層
- state:電梯的狀態(開門、關門等)
行為:
- openDoor():打開電梯門
- closeDoor():關閉電梯門
- moveUp():電梯上升一層
- moveDown():電梯下降一層
并發性:
電梯對象具有自身的線程,可以在不同的時間點接收和處理多個乘客的按鈕按下事件。
事件處理:
當乘客按下按鈕時,電梯對象會觸發相應的操作來改變其狀態和目標樓層,并啟動移動過程。
這個示例展示了主動類如何描述具有生命周期、并發行為和事件處理能力的對象。通過定義主動類,我們可以更好地理解和建模具有并發和反應性的系統,并在設計和開發過程中考慮并發和同步的問題。在實際的UML建模中,可以使用狀態圖和順序圖等來可視化和描述主動類的行為和交互。
2.1.6 構件
在UML中,構件(Component)是軟件系統中的可替換的物理部件,它封裝了實現,并通過一組接口與外部環境進行交互。構件代表了在部署和運行時環境中可觀察到的物理元素,例如可執行文件、庫、框架或插件。
構件的定義通常包括以下幾個部分:
-
名稱和類型:每個構件都有一個唯一的名稱和類型,用于標識和分類構件。類型可以是可執行文件、庫文件或其他二進制文件等。
-
接口:構件通過接口與外部環境進行交互。接口定義了構件提供的服務或操作,并指定了與其他構件或系統元素的交互方式。
-
實現:構件封裝了具體的實現細節,這些實現細節可以是源代碼、二進制代碼或其他形式的實現邏輯。
-
依賴關系:構件之間可能存在依賴關系,表示一個構件依賴于另一個構件的服務或功能。這些依賴關系可以是編譯時依賴或運行時依賴。
例如,考慮一個簡單的Web應用程序,其中包括前端和后端組件。前端組件負責用戶界面和交互邏輯,而后端組件負責數據處理和業務邏輯。每個組件都可以被視為一個構件。
在這個示例中,前端組件可以是一個Web瀏覽器中的JavaScript文件,它提供了用戶界面和交互功能。后端組件可以是一個Web服務器上的Java應用程序,它處理來自前端的請求并返回相應的數據。
前端構件(Frontend Component):
- 名稱:Frontend.js
- 類型:JavaScript文件
- 接口:提供了用戶界面和交互功能的API
- 實現:封裝了前端邏輯和交互的JavaScript代碼
后端構件(Backend Component):
- 名稱:Backend.jar
- 類型:Java應用程序
- 接口:提供了數據處理和業務邏輯的API
- 實現:封裝了后端邏輯和數據處理的Java代碼
這些構件通過HTTP協議進行交互。前端構件發送HTTP請求給后端構件,并接收后端構件返回的HTTP響應。這種交互方式定義了構件之間的接口和依賴關系。
在實際的UML建模中,可以使用組件圖(Component Diagram)來可視化和描述構件之間的關系和依賴。組件圖顯示了系統中不同構件之間的連接和交互方式,并提供了關于構件物理組織和部署的信息。
UML中的構件是軟件系統中的物理部件,它封裝了實現并通過接口與外部環境進行交互。通過定義構件,我們可以更好地理解和組織軟件系統的物理結構,并確保在不同環境中正確部署和運行軟件系統。
2.1.7 節點
在UML中,節點(Node)表示運行時環境中的物理或邏輯資源,它是系統部署和執行的基本單位。節點可以是計算機、服務器、設備或其他具有處理、存儲和通信能力的實體。節點描述了系統的物理拓撲結構以及在這些節點上運行的軟件組件。
節點的定義通常包括以下幾個部分:
- 名稱和類型:每個節點都有一個唯一的名稱和類型,用于標識和分類節點。類型可以是計算機、服務器、設備等。
- 計算資源:節點具有計算資源,包括處理器、內存、存儲設備等。這些資源用于執行和存儲軟件組件。
- 軟件組件:節點上可以部署和運行一個或多個軟件組件,包括應用程序、中間件、操作系統等。這些組件與節點的計算資源進行交互,實現系統的功能。
- 連接關系:節點之間通過連接進行通信和數據傳輸。連接關系可以是網絡連接、通信協議或其他形式的連接。
例如,考慮一個簡單的分布式系統,其中包括Web服務器、數據庫服務器和客戶端節點。每個節點都具有不同的功能和資源,并通過網絡連接進行交互。
在這個示例中,Web服務器節點負責處理Web請求和生成響應,數據庫服務器節點負責存儲和管理數據,而客戶端節點則是用戶與系統交互的接口。
Web服務器節點(Web Server Node):
- 名稱:WebServer
- 類型:服務器
- 計算資源:處理器、內存、存儲設備
- 軟件組件:Web服務器軟件(如Apache)、應用程序代碼等
數據庫服務器節點(Database Server Node):
- 名稱:DatabaseServer
- 類型:服務器
- 計算資源:處理器、內存、存儲設備
- 軟件組件:數據庫管理系統(如MySQL)、數據存儲等
客戶端節點(Client Node):
- 名稱:Client
- 類型:計算機或設備
- 計算資源:處理器、內存、顯示設備等
- 軟件組件:客戶端應用程序(如Web瀏覽器)等
這些節點通過網絡連接進行交互,Web服務器節點接收來自客戶端節點的請求,并與數據庫服務器節點進行通信以獲取數據。這種交互方式定義了節點之間的連接關系和數據傳輸方式。
在實際的UML建模中,可以使用部署圖(Deployment Diagram)來可視化和描述節點之間的關系和連接。部署圖顯示了系統中不同節點的物理拓撲結構以及在這些節點上運行的軟件組件的部署情況。它提供了關于系統如何在實際環境中部署和執行的信息。
總結而言,UML中的節點表示運行時環境中的物理或邏輯資源,描述了系統的物理拓撲結構和軟件組件的部署情況。通過定義節點,我們可以更好地理解系統的實際部署和執行環境,并確保軟件組件在正確的位置運行并與其他組件進行正確的交互。
2.2 行為事物
2.2.1 交互
在UML中,交互(Interaction)描述了對象之間為完成特定任務而進行的通信和協作。交互強調了在系統執行過程中對象之間的動態行為,包括消息傳遞、操作調用和狀態變化等。交互是UML中用于描述系統動態行為的重要概念之一。
交互的定義通常包括以下幾個部分:
- 對象:交互涉及的對象是系統中的類或實例。這些對象可以是系統中的參與者、控制器、業務邏輯等。
- 消息:消息是對象之間進行通信的基本單位。消息可以是操作調用、事件觸發或其他形式的通信。消息傳遞描述了對象之間的協作和交互方式。
- 順序:交互中的對象按照一定的順序發送和接收消息。順序描述了交互的時序和邏輯流程。
- 場景:交互發生在特定的場景中,例如用戶操作、系統響應、異常處理等。場景定義了交互的上下文和目的。
例如,考慮一個簡單的在線購物系統,其中包括用戶、購物車和訂單等對象。用戶瀏覽商品并將商品添加到購物車中,然后提交訂單進行結算。這個過程涉及多個對象之間的交互。
在這個示例中,用戶對象發送消息給購物車對象,將商品添加到購物車中。購物車對象更新狀態并返回確認消息給用戶對象。然后,用戶對象發送提交訂單的消息給訂單對象,訂單對象處理訂單信息并返回結算結果給用戶對象。
交互示例(Interaction Example):
- 用戶(User)對象發送“瀏覽商品”消息給商品(Product)對象。
- 商品對象返回商品詳細信息給用戶對象。
- 用戶對象發送“添加到購物車”消息給購物車(Shopping Cart)對象,并附帶所選商品的信息。
- 購物車對象更新購物車狀態,并返回確認消息給用戶對象。
- 用戶對象發送“提交訂單”消息給訂單(Order)對象,并附帶購物車中的商品信息。
- 訂單對象處理訂單信息,進行結算,并返回結算結果給用戶對象。
在實際的UML建模中,可以使用順序圖(Sequence Diagram)或協作圖(Collaboration Diagram)來描述交互的詳細過程。順序圖顯示了對象之間消息傳遞的順序和時間關系,而協作圖則強調了對象之間的結構關系和協作方式。這些圖表可以幫助我們理解和可視化系統中對象之間的動態行為和交互過程。
UML中的交互描述了系統執行過程中對象之間的通信和協作,包括消息傳遞、操作調用和狀態變化等。通過定義交互,我們可以更好地理解系統的動態行為,并確保系統中的對象能夠正確地進行協作和交互,以實現特定的功能和任務。
2.2.2 狀態機
在UML中,狀態機(State Machine)是一種用于描述對象在其生命周期內狀態變化的模型。它描述了對象在不同狀態下的行為以及狀態之間的轉換條件。狀態機用于捕捉對象在不同情境下的反應和行為,是建模系統中動態行為的重要工具之一。
狀態機的定義通常包括以下幾個部分:
- 狀態(State):狀態是對象在其生命周期中的某個條件或模式。每個狀態都定義了對象在該狀態下的行為和屬性。
- 轉換(Transition):轉換是狀態之間的變化過程。它描述了從一個狀態到另一個狀態的轉換條件和觸發事件。當滿足轉換條件時,對象會從當前狀態轉移到下一個狀態。
- 事件(Event):事件是導致狀態轉換的觸發器。它可以是外部事件(如用戶操作)、內部事件(如系統通知)或時間事件(如定時器到期)。
- 動作(Action):動作是在狀態轉換過程中執行的行為或活動。它可以是進入或退出狀態時的動作,或在特定狀態下執行的動作。
例如,考慮一個簡單的電梯系統,其中電梯具有不同的狀態,如開門、關門、上升和下降等。電梯的狀態根據用戶按下的按鈕和其他條件進行轉換。
在這個示例中,電梯的狀態機可以描述如下:
-
狀態:
- 開門(Door Open):電梯門打開,乘客可以進出。
- 關門(Door Closed):電梯門關閉,準備移動。
- 上升(Up):電梯正在上升。
- 下降(Down):電梯正在下降。
-
轉換:
- 當用戶按下電梯外部的按鈕或電梯內部的樓層按鈕時,從“關門”狀態轉換為“開門”狀態。
- 當電梯門關閉并且選擇了一個目標樓層時,從“開門”狀態轉換為“上升”或“下降”狀態。
- 當電梯到達目標樓層時,從“上升”或“下降”狀態轉換為“開門”狀態。
-
事件:
- 按鈕按下(Button Pressed):用戶按下電梯外部的按鈕或電梯內部的樓層按鈕。
- 門關閉(Door Closed):電梯門完全關閉。
- 到達樓層(Floor Reached):電梯到達目標樓層。
-
動作:
- 打開門:當進入“開門”狀態時,執行打開電梯門的動作。
- 關閉門:當進入“關門”狀態時,執行關閉電梯門的動作。
- 啟動移動:當進入“上升”或“下降”狀態時,執行啟動電梯移動的動作。
- 停止移動:當進入“開門”狀態時,執行停止電梯移動的動作。
在實際的UML建模中,可以使用狀態圖(State Diagram)來描述狀態機的詳細模型。狀態圖顯示了對象的不同狀態、轉換條件、觸發事件和動作,幫助我們理解和可視化對象的狀態變化和行為。通過定義狀態機,我們可以更好地捕捉和理解系統中對象的動態行為,并確保系統在不同狀態下能夠正確地響應和處理各種事件和條件。
2.2.3 活動
在UML中,活動(Activity)是描述系統或對象執行過程的一種模型元素。活動代表了業務流程、操作流程或系統功能執行的一系列步驟和動作。活動通常用于描述系統中的工作流、任務流或交互流程,并可以包含決策點、并發執行和同步點等元素。
活動的定義通常包括以下幾個部分:
- 動作(Action):動作是活動的基本構成單元,代表了執行過程中的一個步驟或操作。動作可以是原子性的,也可以是由多個子動作組成的復合動作。
- 控制流(Control Flow):控制流描述了動作之間的執行順序和條件。它定義了動作之間的轉移和決策點,以及可能的分支和合并。
- 對象流(Object Flow):對象流描述了活動中涉及的對象及其之間的關系。它表示了對象在活動之間的傳遞、使用和變換。
- 決策點(Decision Node):決策點是活動中的條件判斷點,根據特定條件決定控制流的分支。它允許根據條件選擇不同的執行路徑。
- 同步點(Synchronization Point):同步點是活動中的等待或會合點,用于協調并發執行的動作或子活動。它確保相關動作在繼續執行之前達到一致狀態。
例如,考慮一個簡單的在線購物系統中的訂單處理流程。該流程包括接收訂單、驗證訂單、處理支付和發貨等一系列步驟。
在這個示例中,訂單處理流程可以建模為一個活動,具體描述如下:
- 接收訂單(Receive Order):接收客戶提交的訂單信息。
- 驗證訂單(Validate Order):驗證訂單的完整性和有效性,如檢查庫存和價格等。
- 處理支付(Process Payment):處理客戶的支付信息,并與支付系統進行交互。
- 發貨(Ship Order):準備商品并安排發貨。
這些步驟可以通過一系列動作來表示,并使用控制流來描述它們之間的順序和條件。例如,如果訂單無效,則可以通過一個決策點來中斷流程并返回錯誤信息;如果支付成功,則可以繼續到發貨步驟;如果支付失敗,則可以重新嘗試支付或取消訂單。
在實際的UML建模中,可以使用活動圖(Activity Diagram)來描述活動的詳細模型。活動圖顯示了活動中的動作、控制流、對象流、決策點和同步點等元素,幫助我們理解和可視化系統中的業務流程和執行過程。通過定義活動,我們可以更好地組織和描述系統中的工作流和任務流,以及它們之間的關系和交互。
2.3 分組事物
包
在UML中,包(Package)是一種組織和管理模型元素的方式。它提供了一種將相關元素分組在一起的機制,以形成更高層次的結構和模塊化。包可以用于對模型元素進行分類、劃分訪問權限、實現代碼重用和模塊化設計。
包的定義通常包括以下幾個部分:
- 名稱:每個包都有一個唯一的名稱,用于標識和引用該包。
- 元素:包可以包含其他包、類、接口、組件、用例、關系等模型元素。這些元素在包內定義,并與包一起構成一個邏輯單元。
- 可見性:包可以設置其內部元素的可見性,以控制其他包或元素對其的訪問權限。常見的可見性級別有公有(public)、受保護(protected)和私有(private)。
- 依賴關系:包之間可以存在依賴關系,表示一個包依賴于另一個包中的元素。這種依賴關系可以在不同包之間進行交互和協作時產生影響。
例如,考慮一個圖書館管理系統,其中包括用戶管理、圖書管理、借閱管理等多個功能模塊。為了更好地組織這些功能模塊和相關類,我們可以使用包來進行分組。
在這個示例中,我們可以創建以下幾個包:
- 用戶管理包(User Management Package):包含與用戶相關的類,如用戶實體類、用戶登錄驗證類等。
- 圖書管理包(Book Management Package):包含與圖書相關的類,如圖書實體類、圖書目錄管理類等。
- 借閱管理包(Borrowing Management Package):包含與借閱相關的類,如借閱記錄類、借閱操作類等。
通過將相關類分組到不同的包中,我們可以實現更好的代碼組織和模塊化設計。每個包可以獨立開發、測試和重用,降低了系統的復雜性。同時,通過使用包的可見性和依賴關系,我們可以控制不同包之間的交互和訪問權限,提高了系統的安全性和可維護性。
在實際的UML建模中,可以使用包圖(Package Diagram)來描述包的結構和關系。包圖顯示了包之間的依賴關系和包含關系,幫助我們理解和可視化系統的模塊結構和組織方式。通過定義包,我們可以更好地管理和組織UML模型中的元素,提高建模的效率和質量。
2.4 注釋事物
注釋事物(Commenting Elements)是一種模型元素,用于在模型中提供解釋性、描述性或指導性的信息。注釋事物不直接影響系統的執行或行為,但可以幫助開發人員、設計師和其他利益相關者更好地理解和解釋模型。
注釋事物的定義主要包括以下幾個方面:
- 文本描述:注釋事物通常包含一段文本描述,用于提供對模型中某個元素或情況的說明或解釋。這段文本可以是簡短的注釋、描述性段落或更詳細的解釋。
- 關聯對象:注釋事物可以與模型中的其他元素關聯,如類、接口、用例、活動等。通過關聯對象,注釋事物可以針對特定的模型元素提供附加信息或解釋。
- 可視化表示:在UML圖中,注釋事物通常表示為帶有注釋符號(如注釋框或云朵形狀)的圖形元素。注釋符號中包含注釋文本,有時還可以包含其他格式化信息(如標記、顏色等)。
示例:
考慮一個簡單的在線商店系統,其中包含一個名為“購物車”的類。為了更好地解釋購物車類的功能和用途,我們可以使用注釋事物來提供額外的信息。
在這個示例中,我們可以創建一個注釋事物,具體描述如下:
- 文本描述:“購物車類用于存儲用戶選擇的商品,并提供計算總價和結算的功能。”
- 關聯對象:將注釋事物與“購物車”類關聯起來,表明這段注釋是對該類的描述。
- 可視化表示:在UML類圖中,我們可以使用帶有注釋符號的圖形元素來表示這個注釋事物。注釋符號可以放置在“購物車”類附近,并用箭頭指向該類,以顯示它們之間的關聯。
在實際的UML建模中,注釋事物可以幫助提高模型的可讀性和可理解性。通過在模型中添加解釋性和描述性的信息,注釋事物可以促進團隊成員之間的溝通和協作,并確保對模型的一致理解。此外,注釋事物還可以用于記錄設計決策、系統約束或其他重要信息,以便在開發過程中進行參考和回顧。
三、關系
3.1 依賴關系
依賴關系(Dependency)是一種描述模型元素之間關系的方式,表示一個元素依賴于另一個元素的存在或行為。依賴關系表明一個元素在某種程度上依賴于另一個元素,當被依賴的元素發生變化時,可能會影響依賴它的元素。
依賴關系的定義通常包括以下幾個方面:
- 方向性:依賴關系具有方向性,表示依賴的方向。通常使用一個帶箭頭的線來表示依賴關系,箭頭指向被依賴的元素。
- 臨時性:依賴關系通常是臨時的,只在特定的上下文或場景中存在。一旦上下文改變,依賴關系可能也隨之改變或消失。
- 可見性:依賴關系可以具有不同的可見性級別,如公有(public)、私有(private)等。可見性級別決定了其他元素如何訪問和使用依賴關系。
示例:
考慮一個簡單的在線商店系統,其中包括一個“用戶”類和一個“訂單”類。在這個系統中,“訂單”類依賴于“用戶”類,因為每個訂單必須與一個用戶相關聯。
在這個示例中,我們可以描述以下依賴關系:
- “訂單”類依賴于“用戶”類:每個訂單必須有一個與之相關聯的用戶。這種依賴關系可以通過在“訂單”類中添加一個屬性(如“用戶”)來表示,該屬性是對“用戶”類的一個引用。
- 創建訂單時依賴于用戶信息:在創建訂單的過程中,需要獲取用戶的信息(如姓名、地址等)。這意味著“訂單”類的某些方法(如創建訂單的方法)可能會調用“用戶”類的某些方法來獲取必要的信息。這種依賴關系可以通過在UML類圖中使用帶箭頭的虛線來表示,箭頭從“訂單”類指向“用戶”類,表示調用關系。
在實際的UML建模中,依賴關系可以用不同的方式表示,如在類圖中使用帶箭頭的線、在序列圖中使用消息流等。此外,還可以使用一些特定的UML構造型(Stereotype)來進一步描述依賴關系的性質,如<<use>>表示一個元素使用另一個元素的服務或功能。
理解和管理依賴關系對于軟件系統的設計和維護至關重要。通過對依賴關系進行建模和分析,開發人員可以更好地了解系統組件之間的相互作用和影響,從而作出合理的設計決策和優化系統的結構。同時,減少不必要的依賴關系和降低耦合度也是提高軟件質量和可維護性的關鍵措施之一。
3.2 關聯關系
關聯關系(Association)是一種描述模型元素之間結構關系的方式,表示兩個或多個類之間存在某種聯系或連接。關聯關系描述了類之間的靜態結構,即對象之間的連接方式和它們如何相互引用。
關聯關系的定義通常包括以下幾個方面:
- 結構性:關聯關系是類之間的一種結構性關系,描述了類之間的靜態連接。它表示了類之間的對象如何在運行時相互引用和連接。
- 導航性:關聯關系可以具有導航性,即從一個類的對象可以訪問到另一個類的對象。這通過關聯關系上的箭頭來表示,箭頭指向可導航的方向。
- 多重性:關聯關系可以具有多重性,描述了關聯兩端類的對象之間的數量關系。常見的多重性包括一對一(1:1)、一對多(1:N)、多對一(N:1)和多對多(N:M)等。
示例:
考慮一個簡單的在線商店系統,其中包括“顧客”(Customer)類和“商品”(Product)類。在這個系統中,顧客可以購買多個商品,每個商品也可以被多個顧客購買。因此,“顧客”類和“商品”類之間存在一個多對多的關聯關系。
具體地,這個關聯關系可以描述如下:
- “顧客”類和“商品”類之間存在關聯關系:每個顧客可以購買多個商品,每個商品也可以被多個顧客購買。這表示“顧客”類和“商品”類之間有一種連接或聯系。
- 關聯關系具有導航性:從“顧客”類的對象可以訪問到其購買的“商品”類的對象列表,反之亦然。這可以通過在關聯關系上添加箭頭來表示,箭頭指向可導航的方向。
- 關聯關系具有多重性:由于一個顧客可以購買多個商品,而一個商品也可以被多個顧客購買,所以這是一個多對多的關聯關系。在UML類圖中,可以使用多重性標記(如“*”表示多個)來表示這種數量關系。
在實際的UML建模中,關聯關系通常用一條實線來表示,可以在關聯線上添加箭頭表示導航性,還可以在關聯線的兩端添加多重性標記來表示數量關系。此外,還可以使用一些特定的UML構造型(Stereotype)來進一步描述關聯關系的性質,如<<owns>>表示一個類的對象擁有另一個類的對象。
通過建模關聯關系,開發人員可以更好地理解類之間的聯系和相互作用,從而設計出更合理和靈活的系統結構。同時,關聯關系也為實現類之間的交互和協作提供了基礎,幫助開發人員更好地組織和管理代碼。
3.3 泛化關系
在UML(Unified Modeling Language,統一建模語言)中,泛化關系(Generalization)是一種描述類之間繼承關系的方式,表示一個類(子類)繼承另一個類(父類)的屬性和方法。泛化關系也稱為“繼承關系”,是面向對象編程中一種重要的關系。
泛化關系的定義包括以下幾個方面:
- 繼承性:泛化關系表示子類繼承了父類的屬性和方法。子類可以重用父類的代碼,并在需要時添加或覆蓋父類的行為。
- 傳遞性:泛化關系具有傳遞性,即如果類B繼承自類A,類C繼承自類B,那么類C也間接繼承自類A。這意味著子類可以繼承父類以及父類的父類的屬性和方法。
- 多態性:泛化關系支持多態性,即子類可以以父類的形式出現。這意味著可以使用父類的引用來引用子類的對象,并在運行時根據實際對象的類型調用相應的方法。
示例:
考慮一個簡單的動物分類系統,其中包括一個“動物”(Animal)類和一個“狗”(Dog)類。在這個系統中,“狗”類是“動物”類的子類,繼承了“動物”類的屬性和方法。
具體地,這個泛化關系可以描述如下:
- “動物”類是父類,“狗”類是子類:“狗”類繼承了“動物”類的屬性和方法,如“吠叫”(bark)、“奔跑”(run)等。這表示“狗”類是“動物”類的一個特殊化或具體化。
- 泛化關系具有傳遞性:如果有一個“牧羊犬”(ShepherdDog)類作為“狗”類的子類,那么“牧羊犬”類也間接繼承自“動物”類。這意味著“牧羊犬”類可以繼承“動物”類和“狗”類的屬性和方法。
- 泛化關系支持多態性:可以使用“動物”類的引用來引用“狗”類或“牧羊犬”類的對象,并在運行時根據實際對象的類型調用相應的方法。例如,可以定義一個名為“動物叫聲”(animalSound)的方法,在“動物”類中定義為虛方法(virtual method),在“狗”類中覆蓋(override)為“汪汪叫”(woof),在“牧羊犬”類中覆蓋為特定的叫聲。這樣,當通過“動物”類的引用調用“animalSound”方法時,會根據實際對象的類型(狗或牧羊犬)播放相應的叫聲。
在實際的UML建模中,泛化關系通常用一條帶空心的三角箭頭的實線來表示,箭頭指向父類。這個空心三角箭頭是泛化關系的標志性符號,用于區分其他類型的關系。此外,還可以在泛化關系線上添加一些標簽或注釋來提供額外的信息,如訪問修飾符(public、protected、private)或約束條件等。
通過建模泛化關系,開發人員可以更好地組織和管理代碼,實現代碼的重用和擴展。泛化關系也為構建更復雜的系統提供了基礎,通過將公共的行為和屬性抽象到父類中,可以簡化子類的設計和實現,并提高系統的可維護性和可擴展性。
3.4 實現關系
實現關系(Realization)是一種描述類(或組件)與其接口之間關系的方式,表示類實現了某個接口所定義的行為。實現關系在面向對象編程中非常重要,它確保類遵循接口規定的契約,從而實現代碼的解耦和靈活性。
實現關系的定義包括以下幾個方面:
- 契約性:接口定義了一組方法的契約,即方法名稱、參數和返回類型。實現關系表示類實現了接口所規定的這些方法,從而滿足了接口的契約。
- 多重性:一個類可以實現多個接口,這意味著它可以同時遵循多個接口定義的契約。這有助于實現代碼的靈活性和可擴展性。
- 多態性:實現關系支持多態性,即一個接口可以有多個實現類。這意味著可以使用接口引用來引用實現類的對象,并在運行時根據實際對象的類型調用相應的方法。
示例:
考慮一個簡單的在線支付系統,其中包括一個“支付方式”(PaymentMethod)接口和一個“信用卡支付”(CreditCardPayment)類。在這個系統中,“信用卡支付”類實現了“支付方式”接口,從而提供了一種具體的支付方式。
具體地,這個實現關系可以描述如下:
- “支付方式”接口定義了一個“支付”(pay)方法,該方法接受支付金額作為參數。這表示任何實現“支付方式”接口的類都需要提供“支付”方法的具體實現。
- “信用卡支付”類實現了“支付方式”接口:這意味著“信用卡支付”類必須提供“支付”方法的具體實現。在實現過程中,“信用卡支付”類可能需要調用銀行API或其他支付網關來完成實際的支付操作。
- 實現關系支持多態性:可以使用“支付方式”接口的引用來引用“信用卡支付”類的對象,并在運行時調用其“支付”方法。例如,可以定義一個名為“處理支付”(processPayment)的方法,該方法接受一個“支付方式”接口的引用作為參數,并在內部調用該引用的“支付”方法。這樣,當傳入不同的實現類對象(如“信用卡支付”類或其他實現類的對象)時,該方法可以根據實際對象的類型調用相應的支付方法。
在實際的UML建模中,實現關系通常用一條帶空心的三角箭頭的虛線來表示,箭頭指向接口。這個空心三角箭頭是實現關系的標志性符號,用于區分其他類型的關系。此外,還可以在實現關系線上添加一些標簽或注釋來提供額外的信息,如接口名稱或方法簽名等。
通過建模實現關系,開發人員可以更好地理解類與接口之間的關系,并確保類實現了接口所規定的行為。這有助于實現代碼的解耦和可擴展性,同時提高了系統的靈活性和可維護性。
四、公共機制
(暫略,待舉例說明)?