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

本文呈現一個全面的案例研究關於一個共享出行應用程式之預約流程,使用UML 序列圖。我們將完整走過乘客預約行程的整個生命週期——從輸入到確認——包含司機匹配, 逾時處理, 非同步通知,以及重試邏輯.
為了讓這項內容更具實用性且可立即應用,我們提供一個完全修正、有效且可投入生產的 PlantUML 程式碼片段產生乾淨且符合標準的序列圖。
已註冊的乘客開啟行動應用程式,輸入上車與下車地點,選擇搭乘類型(例如:經濟型、豪華型),並提出搭乘請求。系統執行下列動作:
估算費用與預計抵達時間透過 地圖服務.
尋找附近可接駁的駕駛在一定範圍內(帶有逾時機制)。
傳送搭乘請求給最符合條件的駕駛。
等待 駕駛接受或拒絕(30 秒逾時)。
若被接受:
指派搭乘。
通知乘客與駕駛。
啟動即時追蹤。
若在時間內無駕駛接受:
將請求標記為失敗。
提供重新嘗試或取消。
這反映了共享搭乘應用程式在現實世界中的行為:動態匹配, 非同步回應,以及 對無駕駛接受情境的韌性.
| 概念 | 在此圖中的角色 |
|---|---|
| 生命線 | 每個參與者之垂直虛線(例如,乘客, 叫車服務, 司機) |
同步訊息(->) |
直接呼叫(例如,RS -> DM:尋找最近司機) |
非同步訊息(-->) |
非阻塞或回應(例如,NS --> 司機:推送通知) |
| 激活條 | 顯示處理時間(啟用 / 停用) |
| 替代片段 | 條件:alt 司機接受 對 否則 超時/拒絕 |
| 可選片段 | 可選流程(例如:高級乘車選擇) |
| 迴圈片段 | 在多位司機間重複搜尋(迴圈 找尋可用司機) |
| 參考片段 | 對子序列的參考(例如:startTrackingSession) |
參與者(乘客, 司機) |
啟動動作的外部使用者 |
外部服務(<<外部>>) |
地圖服務, 通知服務 |
| 時間推進 | 由上至下 — 時間的邏輯流程 |
| 參與者 | 角色 |
|---|---|
乘客 |
發起搭乘請求的參與者 |
行動應用程式 |
處理輸入與顯示的前端使用者介面 |
搭乘服務 |
核心後端服務,用於管理搭乘生命週期 |
司機匹配服務 |
將乘客與附近的司機配對 |
用於路徑規劃、費用計算與預計到達時間的外部服務 |
用於路徑規劃、費用與預計到達時間的外部服務(<<外部>>) |
發送推播、簡訊或電子郵件給司機與乘客的服務 |
向司機與乘客發送推播/簡訊/電子郵件(<<外部>>) |
參與者(司機應用程式)回應搭乘請求 |
參與者(司機應用程式)回應搭乘請求 |
@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 → 點選「產生」→ 立即查看完整流程的渲染結果。
貼上程式碼 → 點擊 「產生」
✅ 即時視覺序列圖
💡 專家提示:新增
skinparam backgroundColor #F8F8F8以獲得乾淨的白色背景。
開啟 Visual Paradigm Desktop 或 VP Online
建立新的 序列圖
使用 工具 > 匯入 > PlantUML → 貼上程式碼
自動產生包含生命線、訊息與激活條
使用 chat.visual-paradigm.com 來提問:
「將此共乘序列重構為微服務架構:分離 RideService、MatchingService、NotificationService 與 PaymentService。在匹配後加入可選的付款步驟。」
VP AI 將:
拆分 RideService 為 騎乘控制器, 騎乘服務, 付款服務
新增付款服務與processPayment()呼叫
新增<<外部>>用於付款網關
新增可選用於可選升級至高級版
開啟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 後端的整合?
只需提出要求——我會為您生成完整的架構模型。
✨ 精確建模。快速開發。自信交付。