前言
統一建模語言 (UML) 是軟件工程的標準建模語言,提供了一套圖形化符號系統,用於可視化、規範化、構建和文檔化軟件系統制品。本文以「圖書館借閱管理系統」為案例,完整演示從需求分析 → 面向對象分析 (OOA) → 架構設計 → 詳細設計 → Java 代碼實現的全生命周期建模過程,展示 UML 如何指導實際開發。
案例背景:圖書館系統需求
- 支持圖書/雜志借閱、歸還、預訂
- 讀者、圖書管理員雙角色
- 書目、讀者、借閱記錄、預訂記錄增刪改查
- 暢銷書多副本管理、舊書下架
- 跨平台運行、友好 GUI、易擴展
階段一:需求分析與用例建模
參與者
- 圖書管理員:系統主要操作者,代理讀者完成業務
- 讀者:服務對象,不直接操作系統
用例圖
┌─────────────────────────────────────┐
│ 圖書館管理系統 │
├─────────────────────────────────────┤
│ ◎ 借書 ◎ 還書 │
│ ◎ 生成預訂 ◎ 刪除預訂 │
│ ◎ 增加書目 ◎ 更新/刪除書目 │
│ ◎ 添加圖書 ◎ 刪除圖書 │
│ ◎ 添加讀者 ◎ 更新/刪除讀者 │
└─────────────────────────────────────┘
▲ ▲
│ │
┌────┴────┐ ┌────┴────┐
│圖書管理員│ │ 讀者 │
└─────────┘ └─────────┘
關鍵用例流程:借書 (無預訂)
- 識別書名
- 查找可借副本
- 識別讀者身份
- 辦理借出登記
- 記錄借閱信息
階段二:面向對象分析 (OOA) - 領域模型
核心領域類
| 類名 | 職責 | 關鍵屬性 |
| BorrowerInformation | 讀者信息 | id, name, contact, status |
| Title | 書目 (邏輯書籍) | isbn, name, type(書/雜志), status |
| BookTitle / Magazine | 具體類型 (可合併為 Title.type) | - |
| Item | 實體副本 | barcode, title, status(在館/借出/預訂) |
| Loan | 借閱記錄 | borrower, item, borrowDate, dueDate |
| Reservation | 預訂記錄 | borrower, title, reserveDate, status |
類圖關係
Title "1" ◄── "0..*" Item ──► "0..1" Loan
Title "1" ◄── "0..*" Reservation
BorrowerInformation "1" ◄── "0..*" Loan
BorrowerInformation "1" ◄── "0..*" Reservation
狀態圖:Item 生命周期
[在館] ──借出──► [借出] ──歸還──► [在館]
▲ │
└────────預訂滿足──────────┘
▲
└────────預訂取消──────────┘
序列圖:借書交互
:Librarian :UI窗口 :Title :Item :Borrower :Loan
│ │ │ │ │ │
├─借書請求──►│ │ │ │ │
│ ├─查書目────►│ │ │ │
│ │◄─書目信息──┤ │ │ │
│ ├─查可借副本──────────►│ │ │
│ │◄─副本列表────────────┤ │ │
│ ├─驗證讀者──────────────────────►│ │
│ │◄─讀者信息───────────────────────┤ │
│ ├─創建借閱記錄────────────────────────────►│
│ │◄─借閱記錄───────────────────────────────┤
│◄─完成確認──┤ │ │ │ │
階段三:架構設計 - 分層與包結構
四層包架構
| 包名 | 職責 | 關鍵類 | 依賴 |
| User Interface (UI) | Swing/AWT 界面、用戶交互 | LendDialog, ReturnDialog, TitleManager | → Business Object |
| Business Object (BO) | 領域邏輯、業務規則 | BorrowerInformation, Title, Item, Loan, Reservation | → Database |
| Database (DB) | 持久化服務 | Persistent (基類), ObjId, FileStorage | ← BO 繼承 Persistent |
| Utility | 通用工具 | ObjId (對象標識) | 被所有包使用 |
架構原則
- 分層隔離:UI 不直接訪問 DB,通過 BO 中介
- 單向依賴:UI → BO → DB,無循環依賴
- 持久化抽象:BO 繼承
Persistent,屏蔽存儲細節 (文件/關係數據庫/OODB)
- 對象標識:
ObjId 統一引用持久對象,支持跨層傳遞
階段四:詳細設計 - 類規築與動態模型
BO 包詳細類圖
┌──────────────────┐ ┌──────────────────┐
│ Title │ │ Item │
├──────────────────┤ ├──────────────────┤
│ - isbn: String │ │ - barcode: String│
│ - name: String │ │ - status: Enum │
│ - type: Type │◄──────│ - title: ObjId │
│ - status: Enum │ 1..* │ - loan: ObjId │
│ - reservations │ ├──────────────────┤
├──────────────────┤ │ + getTitle() │
│ + addReservation()│ │ + setStatus() │
│ + removeReservation() │ + getLoan() │
│ + getAvailableItems() └──────────────────┘
└──────────────────┘
狀態圖細化:Title 狀態機
[正常] ──添加預訂──► [有預訂] ──預訂滿足/取消──► [正常]
│ ▲
└──────────所有副本借出────────────────┘
序列圖:添加書目
:Librarian → :TitleManagerUI → :TitleController → :Title (new) → :Persistent.store()
協作圖:添加書目 (替代視角)
[Librarian] → (1) TitleManagerUI → (2) TitleController → (3) new Title → (4) Persistent.store()
階段五:Java 代碼實現映射
組件圖:邏輯類到文件映射
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Title.java │ │ Item.java │ │ Loan.java │
│ (BO包) │ │ (BO包) │ │ (BO包) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────┐
│ Persistent.java (DB包) │
│ + store() + update() + delete() + find() │
└─────────────────────────────────────────────────┘
關鍵實現模式
1. 持久化基類模式
public abstract class Persistent implements Serializable {
protected ObjId objId; // 對象標識
public void store() { Database.store(this); }
public void update() { Database.update(this); }
public void delete() { Database.delete(this); }
// 模板方法:子類實現具體查找邏輯
public static Persistent getObject(ObjId id) {
return Database.find(id);
}
}
// 領域類繼承
public class Title extends Persistent {
private String isbn;
private String name;
// 業務方法...
}
2. 對象標識模式
public class ObjId implements Serializable {
private long id; // 全局唯一
public static ObjId newId() { return new ObjId(IdGenerator.next()); }
// 關聯引用存儲 ObjId 而非直接對象引用
}
3. 狀態模式實現 Item 狀態機
public enum ItemStatus { AVAILABLE, LOANED, RESERVED }
public class Item extends Persistent {
private ItemStatus status;
private ObjId titleId;
private ObjId loanId; // 當前借閱記錄
public void checkout(ObjId borrowerId) {
if (status != AVAILABLE) throw new IllegalStateException();
status = LOANED;
Loan loan = new Loan(borrowerId, this.objId);
loan.store();
this.loanId = loan.getObjId();
update();
}
}
開發流程中的模型-代碼同步
- 正向工程:模型 → 代碼骨架 (IDE/工具生成)
- 逆向工程:代碼 → 模型 (重構後同步)
- 圖表驅動編碼:編碼時參考類圖(結構)、狀態圖(行為)、序列圖(交互)
- 持續同步:重構必須更新模型,模型變更必須反映代碼
現代視角:UML 在敏捷/微服務時代的定位
| 傳統重度使用 | 現代輕量級實踐 |
| 完整 13 種圖表 | 核心 3-5 圖:類圖、序列圖、組件圖、部署圖、狀態圖 |
| 大量前期設計 (BDUF) | 即時建模、演進式架構、架構決策記錄 (ADR) |
| CASE 工具強綁定 | PlantUML/Mermaid 文本建模、IDE 集成、版本控制友好 |
| 文檔為主 | 代碼即文檔、測試即規格、圖表輔助溝通 |
總結
本文通過圖書館系統案例,完整展示了 UML 從需求捕獲 (用例圖) → 領域分析 (類圖/狀態圖/序列圖) → 架構設計 (包圖/分層) → 詳細設計 (精化類/動態模型) → Java 實現 (持久化模式/對象標識/狀態機) 的全流程建模指導。UML 的核心價值在於 溝通語言標準化、設計決策顯性化、複雜性可視化管理。現代實踐中,建議採用「文本建模 + 關鍵圖表 + 演進式更新」的輕量級方式,讓 UML 服務於代碼而非成為負擔。
- 上一篇文章: 基於 Java Web 服務 (JAX-WS/SOAP) 構建聊天應用完整教程
- 下一篇文章: JDK 5.0 集合框架新特性深度解析:Arrays、Collections 與 Queue
Copyright ©
程式碼之家 All Rights Reserved