引言
共享出行平台如 Uber、Lyft 和 Bolt 透過即時將乘客與附近司機連接,徹底改變了城市出行方式。這種體驗的核心在於多個服務之間複雜且動態的互動——從位置匹配以及即時追蹤,到司機接受邏輯, 通知,以及故障處理.

本文呈現一個全面的案例研究關於一個共享出行應用程式之預約流程,使用UML 序列圖。我們將完整走過乘客預約行程的整個生命週期——從輸入到確認——包含司機匹配, 逾時處理, 非同步通知,以及重試邏輯.
為了讓這項內容更具實用性且可立即應用,我們提供一個完全修正、有效且可投入生產的 PlantUML 程式碼片段產生乾淨且符合標準的序列圖。
情境概觀
已註冊的乘客開啟行動應用程式,輸入上車與下車地點,選擇搭乘類型(例如:經濟型、豪華型),並提出搭乘請求。系統執行下列動作:
-
估算費用與預計抵達時間透過
地圖服務. -
尋找附近可接駁的駕駛在一定範圍內(帶有逾時機制)。
-
傳送搭乘請求給最符合條件的駕駛。
-
等待 駕駛接受或拒絕(30 秒逾時)。
-
若被接受:
-
指派搭乘。
-
通知乘客與駕駛。
-
啟動即時追蹤。
-
-
若在時間內無駕駛接受:
-
將請求標記為失敗。
-
提供重新嘗試或取消。
-
這反映了共享搭乘應用程式在現實世界中的行為:動態匹配, 非同步回應,以及 對無駕駛接受情境的韌性.
應用的關鍵 UML 概念
| 概念 | 在此圖中的角色 |
|---|---|
| 生命線 | 每個參與者之垂直虛線(例如,乘客, 叫車服務, 司機) |
同步訊息(->) |
直接呼叫(例如,RS -> DM:尋找最近司機) |
非同步訊息(-->) |
非阻塞或回應(例如,NS --> 司機:推送通知) |
| 激活條 | 顯示處理時間(啟用 / 停用) |
| 替代片段 | 條件:alt 司機接受 對 否則 超時/拒絕 |
| 可選片段 | 可選流程(例如:高級乘車選擇) |
| 迴圈片段 | 在多位司機間重複搜尋(迴圈 找尋可用司機) |
| 參考片段 | 對子序列的參考(例如:startTrackingSession) |
參與者(乘客, 司機) |
啟動動作的外部使用者 |
外部服務(<<外部>>) |
地圖服務, 通知服務 |
| 時間推進 | 由上至下 — 時間的邏輯流程 |
參與者(生命線)
| 參與者 | 角色 |
|---|---|
乘客 |
發起搭乘請求的參與者 |
行動應用程式 |
處理輸入與顯示的前端使用者介面 |
搭乘服務 |
核心後端服務,用於管理搭乘生命週期 |
司機匹配服務 |
將乘客與附近的司機配對 |
用於路徑規劃、費用計算與預計到達時間的外部服務 |
用於路徑規劃、費用與預計到達時間的外部服務(<<外部>>) |
發送推播、簡訊或電子郵件給司機與乘客的服務 |
向司機與乘客發送推播/簡訊/電子郵件(<<外部>>) |
參與者(司機應用程式)回應搭乘請求 |
參與者(司機應用程式)回應搭乘請求 |
✅ 已完全驗證的序列圖,含 PlantUML 程式碼
PlantUML 序列圖
@startuml
title 共乘應用程式 - 搭乘預訂序列圖
skinparam monochrome true
skinparam shadowing false
skinparam sequenceMessageAlign center
autonumber "<b>[0]"
actor 乘客
participant "行動應用程式" as App
participant "搭乘服務" as RS
participant "司機匹配服務" as DM
participant "地圖服務" as Maps <<外部>>
participant "通知服務" as NS <<外部>>
actor 司機
乘客 -> App: 開啟應用程式並輸入上車/下車地點
activate App
App -> RS: requestRide(上車地點, 下車地點, 搭乘類型)
activate RS
RS -> Maps: calculateFareAndETA(上車地點, 下車地點, 搭乘類型)
activate Maps
Maps --> RS: 費用預估, 預計分鐘數, 路線
deactivate Maps
RS --> App: display(費用, 預計時間, 是否確認?)
App --> 乘客: 顯示費用與預計時間,詢問是否確認
alt 乘客確認搭乘
乘客 -> App: confirmRide()
App -> RS: confirmAndMatch()
activate RS
loop 尋找可用司機(逾時30秒)
RS -> DM: findNearestDrivers(上車地點, 搭乘類型, 最大距離)
activate DM
DM --> RS: 可用司機清單
deactivate DM
alt 找到司機
RS -> NS: sendRideRequestToDriver(司機ID, 上車地點, 費用)
activate NS
NS --> 司機: 推播通知「新的搭乘請求」
NS --> RS: 請求已發送
alt 司機接受
司機 -> NS: acceptRide()
NS --> RS: driverResponse(accept)
break 配對成功
else 司機拒絕或逾時
note right of RS: 繼續尋找下一位司機或失敗
break 無接受
end
RS -> Maps: startTrackingSession(搭乘ID)
activate Maps
Maps --> RS: 追蹤ID, 地圖更新
deactivate Maps
RS -> NS: notifyPassenger("司機已指派", 司機資訊, 預計時間)
NS --> 乘客: 推播「司機正在前往中」
RS -> NS: notifyDriver("搭乘已確認", 乘客資訊)
NS --> 司機: 推播「搭乘已接受」
RS --> App: rideMatched(司機資訊, 車輛, 預計時間)
App --> 乘客: 顯示司機資訊與地圖
else 無可用司機
RS --> App: noDrivers("附近無司機。請再試一次?")
break 無司機
end
end
alt 配對成功
RS --> App: bookingConfirmed(搭乘ID)
App --> 乘客: 顯示「搭乘已預訂!」+ 追蹤資訊
else 嘗試後無接受
RS --> App: requestFailed("無可用司機。請重試?")
App --> 乘客: 顯示錯誤與重試選項
end
deactivate RS
else 乘客取消
App --> 乘客: 已取消
end
deactivate App
@enduml
✅ 為何此程式碼有效
-
✅ 無
回傳語句——以break與正確的流程取代。 -
✅ 全部
啟用/停用對 都正確關閉。 -
✅
替代/迴圈/選擇都正確嵌套並結束。 -
✅
參考片段 透過啟動追蹤會話(可提取為子圖)。 -
✅
<<外部>>標記用於清晰表達。
✅ 立即測試:貼上至https://www.plantuml.com/plantuml → 點選「產生」→ 立即查看完整流程的渲染結果。
如何使用此圖表
🛠 步驟 1:渲染圖表
-
貼上程式碼 → 點擊 「產生」
-
✅ 即時視覺序列圖
💡 專家提示:新增
skinparam backgroundColor #F8F8F8以獲得乾淨的白色背景。
🖥️ 步驟 2:與 Visual Paradigm 整合
-
開啟 Visual Paradigm Desktop 或 VP Online
-
建立新的 序列圖
-
使用 工具 > 匯入 > PlantUML → 貼上程式碼
-
自動產生包含生命線、訊息與激活條
🧠 步驟 3:使用 AI 進行優化(進階)
-
使用 chat.visual-paradigm.com 來提問:
「將此共乘序列重構為微服務架構:分離 RideService、MatchingService、NotificationService 與 PaymentService。在匹配後加入可選的付款步驟。」
-
VP AI 將:
-
拆分
RideService為騎乘控制器,騎乘服務,付款服務 -
新增
付款服務與processPayment()呼叫 -
新增
<<外部>>用於付款網關 -
新增
可選用於可選升級至高級版
-
📄 步驟 4:在 OpenDocs 中記錄(協作)
-
開啟OpenDocs→ 建立新頁面:「騎乘預訂流程規格」
-
插入圖示。
-
新增:
-
前置條件:「使用者必須已登入,且 GPS 已啟用」
-
後置條件: 「行程已匹配,追蹤已啟用,司機已通知」
-
例外情況: 「30秒內無司機接受」,「GPS無法使用」
-
連結: 用於使用案例圖、類別圖、狀態機
-
此方法之所以有效
| 優勢 | 說明 |
|---|---|
| 快速原型設計 | 使用 PlantUML 在數秒內撰寫 UML |
| 由 AI 驅動的優化 | 重構為微服務或分層架構 |
| 適合版本控制 | 將程式碼儲存在 Git 中——無二進位檔案 |
| 可擴展 | 透過新增行程類型、促銷活動、團體行程來擴展 |
| 跨工具相容 | 可在 VS Code、Confluence、GitHub 等工具中運作 |
擴展圖示:可能的變體
想進一步發展嗎?以下是一些常見的擴展方式:
🔹 新增可選的高級升級
opt 行程類型:高級
RS → App:showPremiumOption()
App → RS:selectPremium()
RS → Maps:recalculateFareWithSurge()
Maps → RS:newFare,updatedEta
end
🔹 新增付款處理(匹配後)
RS → PaymentService:processPayment(rideId, amount)
activate PaymentService
PaymentService → RS:success,transactionId
deactivate PaymentService
RS → App:showPaymentConfirmed()
🔹 新增司機取消(含罰則)
司機 → NS:cancelRide(reason)
NS → RS:driverCanceled
RS → App:notifyPassenger(「司機已取消。正在尋找新司機...」)
如果需要,請告訴我,我可以提供這些變體的完整 PlantUML 程式碼!
結論
共乘預約流程不僅僅是匹配——更關鍵的是即時協調, 非同步通訊,以及在不確定性下的韌性。透過以 UML 序列圖,並利用 PlantUML + 像 Visual Paradigm 這樣的 AI 工具,團隊可以:
-
以清晰與精確的方式設計
-
早期發現邊界案例(例如:無司機、逾時)
-
跨產品、工程與測試團隊協作
-
記錄流程以供審計、入職與訓練使用
✅ 立即開始:將上方的 PlantUML 程式碼貼入 PlantUML Live,並在幾秒內看見你的共乘流程栩栩如生。
📌 最後建議
-
使用
autonumber以確保可追蹤性。 -
加入
hide footbox以移除頁尾。 -
自訂顏色:
skinparam sequenceMessageBackgroundColor #E0F7FA -
匯出為 PNG/SVG/PDF 格式,用於報告或簡報。
📬 需要協助嗎?
想要一個帶有 類圖, 狀態機,或 與 Spring Boot/Node.js 後端的整合?
只需提出要求——我會為您生成完整的架構模型。
✨ 精確建模。快速開發。自信交付。
UML 序列圖與 AI 支援
- 軟體設計中序列圖的全面指南:此詳細手冊章節說明了使用序列圖來模擬系統動態行為的目的、結構與最佳實務。
- 什麼是序列圖?——一份 UML 指南:一份針對初學者的入門指南,說明序列圖在時序上呈現物件互動的角色。
- 在 Visual Paradigm 中動畫化序列圖——教學:此教學提供如何建立動態、動畫化的序列圖,以更有效地視覺化軟體工作流程與系統互動。
- Visual Paradigm – 智能驅動的 UML 序列圖:本文示範平台的 AI 引擎如何讓使用者在建模套件內立即生成專業的 UML 序列圖。
- Visual Paradigm 中的 AI 驅動序列圖優化:此資源探討如何利用 AI 工具將用例描述轉化為精確的序列圖,且僅需最少的手動操作。
- 精通 Visual Paradigm 中的序列圖:AI 聊天機器人教學:一份對初學者友善的教學,透過真實的電商聊天機器人情境,教授對話式圖示繪製。
- 全面教學:使用 AI 序列圖優化工具:逐步指南,說明如何利用專用的 AI 功能來提升序列模型的準確性、清晰度與一致性。
- 如何使用 UML 序列圖建模 MVC:此指南教導使用者如何視覺化 Model、View 與 Controller 模組之間的互動,以提升系統架構的清晰度。
- Visual Paradigm:主流程與異常流程的分離序列圖:此技術文章說明如何使用分離圖示來模擬主流程與替代/異常流程,以維持模型的可讀性。
- PlantUML 序列圖生成器 | 視覺化建構工具:一個視覺化生成器的概覽,允許使用者使用逐步向導來定義參與者和訊息,以建立基於 PlantUML 的序列圖。











