低層設(shè)計(LLD)詳解:從需求到 C++ 源碼實現(xiàn))
示例工程【免費下載鏈接】awesome-low-level-designLearn Low Level Design (LLD) and prepare for interviews using free resources.項目地址https://gitcode.com/GitHub_Trending/aw/awesome-low-level-design點擊查看免費下載本文以倉庫 solutions/cpp/trafficsignalsystem/README.md 為核心骨架結(jié)合倉庫內(nèi)完整的 C 源碼實現(xiàn)系統(tǒng)講解如何為一個多道路交叉口的交通信號控制系統(tǒng)做面向?qū)ο笤O(shè)計LLD與編碼落地。讀完本文你將掌握信號燈狀態(tài)機建模、可配置時長設(shè)計、路口級聚合與系統(tǒng)級單例控制、故障恢復機制以及如何用 C 將一套 LLD 設(shè)計轉(zhuǎn)化為可編譯運行的演示程序。一、問題背景為什么用 LLD 來做交通信號系統(tǒng)交通信號控制系統(tǒng)是面試中非常經(jīng)典的低層設(shè)計Low Level Design, LLD題目。它的業(yè)務(wù)足夠熟悉、邊界足夠清晰又天然包含狀態(tài)流轉(zhuǎn)、配置化參數(shù)、故障處理、擴展性等設(shè)計要點非常適合考察候選人從需求分析到類圖設(shè)計再到代碼落地的完整能力。在 awesome-low-level-design 倉庫中交通信號系統(tǒng)同時提供了 Java、Python、C、C#、Go、TypeScript 等多語言實現(xiàn)其中 C 實現(xiàn)位于 solutions/cpp/trafficsignalsystem/由 4 個頭文件 / 源文件 1 個演示入口組成代碼量精簡但完整覆蓋了核心設(shè)計點。倉庫給出的參考類圖如下來自 problems/traffic-signal.md 所引用的規(guī)范設(shè)計說明該參考類圖體現(xiàn)了完整的 LLD 形態(tài)——單例的總控制器、路口級控制器、信號燈狀態(tài)機State 模式與狀態(tài)通知Observer 模式。C 實現(xiàn)在此基礎(chǔ)上做了工程簡化用Signal信號燈、Intersection路口、TrafficSystem系統(tǒng)三個聚合層級承載同等職責下文會逐一對照講解。二、需求分析6 條核心需求逐條拆解原 README 定義了 6 條需求它們是整個設(shè)計的出發(fā)點逐條拆解如下控制多道路交叉口的交通流系統(tǒng)要以“路口Intersection”為基本管理單元一個路口聚合多條道路上的信號燈而不是只管理孤立的單個燈。支持紅、黃、綠三種信號信號燈顏色是有限狀態(tài)集合天然適合用枚舉enum建模如 C 實現(xiàn)中的SignalColor { RED, YELLOW, GREEN }。每種信號的持續(xù)時間可配置、可根據(jù)交通狀況調(diào)整綠燈/黃燈/紅燈時長不能寫死必須在創(chuàng)建時傳入、并支持運行期調(diào)整。信號之間平滑過渡保證安全高效的交通流顏色切換必須遵循固定順序——RED → GREEN → YELLOW → RED不允許紅燈直接跳綠燈等危險行為過渡邏輯要封裝在單一職責的切換函數(shù)中。能夠檢測并處理緊急情況如救護車、消防車接近路口。C 演示中通過“路口故障/恢復”模擬了突發(fā)狀態(tài)的處理setOperational(false)讓所有燈停擺恢復后重新同步??蓴U展、可擴展新功能設(shè)計要留出擴展點例如后續(xù)接入傳感器實時調(diào)整綠燈時長、增加緊急車輛優(yōu)先通道等核心代碼結(jié)構(gòu)不應(yīng)因此推倒重來。三、類設(shè)計README 描述的參考結(jié)構(gòu)原 README 的“Classes, Interfaces and Enumerations”一節(jié)定義了參考設(shè)計的 5 個核心單元這是回答“請畫出類圖”時的標準答案Signal枚舉表示交通燈的三種狀態(tài)——red、yellow、green。Road類代表道路屬性包括 ID、名稱以及與其關(guān)聯(lián)的信號燈traffic light。TrafficLight類代表信號燈屬性包括 ID、當前信號、每種信號狀態(tài)的時長提供改變信號的方法并能在信號變化時通知觀察者如道路。TrafficController類系統(tǒng)的中央控制器采用Singleton 單例模式確保系統(tǒng)只有唯一實例負責管理道路及其信號燈、啟動交通控制流程、處理緊急情況。TrafficSignalSystemDemo類應(yīng)用入口演示如何創(chuàng)建道路、創(chuàng)建信號燈、把信號燈分配給道路、啟動控制流程。四、C 源碼實現(xiàn)剖析從類圖到可運行代碼參考設(shè)計落到 C 時倉庫采用了職責等價但更工程化的命名與層級。下面是 README 概念類與 C 實際類的對照關(guān)系README 參考類C 實際類文件對應(yīng)職責Signal枚舉SignalColor枚舉Signal.hpp紅/黃/綠三種狀態(tài)RoadTrafficLightSignal類Signal.hpp攜帶 ID、當前顏色、三色時長、剩余時間、工作狀態(tài)路口聚合Intersection類Intersection.hpp管理一個路口下的多個信號燈負責同步與整體啟停TrafficControllerTrafficSystem類TrafficSystem.hpp系統(tǒng)級中央控制統(tǒng)一 ID 生成、路口增刪、信號燈增刪、全局更新TrafficSignalSystemDemoTrafficSystemDemoTrafficSystemDemo.cpp入口演示程序4.1 信號燈實體Signal與SignalColorSignal.hpp 定義了三色枚舉與信號燈實體enum class SignalColor { RED, YELLOW, GREEN };Signal類持有以下狀態(tài)字段signalId信號燈唯一標識currentColor當前顏色初始為紅燈greenDuration / yellowDuration / redDuration三種顏色的持續(xù)時間秒構(gòu)造時可配置默認值為green30, yellow5, red30見 Signal.hpp 的默認參數(shù)timeRemaining當前顏色剩余時間isWorking工作狀態(tài)false 表示故障/停用。關(guān)鍵方法setDurations(green, yellow, red)運行期重設(shè)三色時長并重置狀態(tài)對應(yīng)需求 3“可根據(jù)交通狀況調(diào)整”updateSignal(timeElapsed)按流逝時間遞減剩余時間倒計時歸零即觸發(fā)switchColor()switchColor()嚴格按RED → GREEN → YELLOW → RED順序流轉(zhuǎn)Signal.cpp保證過渡安全對應(yīng)需求 4setWorking(bool)/reset()故障開關(guān)與復位回到紅燈、剩余時間置為 redDuration。switchColor的實現(xiàn)很好地體現(xiàn)了狀態(tài)機“無非法跳轉(zhuǎn)”的核心思想void Signal::switchColor() { switch (currentColor) { case SignalColor::RED: currentColor SignalColor::GREEN; timeRemaining greenDuration; break; case SignalColor::GREEN: currentColor SignalColor::YELLOW; timeRemaining yellowDuration; break; case SignalColor::YELLOW: currentColor SignalColor::RED; timeRemaining redDuration; break; } }4.2 路口聚合IntersectionIntersection.hpp 對應(yīng) README 中“控制交叉口多條道路交通流”的需求 1以std::vectorSignal*聚合一個路口下的所有信號燈并提供addSignal / removeSignal增刪信號燈按signalId查找并釋放內(nèi)存updateSignals(timeElapsed)批量推進路口下所有信號燈的時間步synchronizeSignals()把所有信號燈重置到初始紅燈狀態(tài)用于故障恢復后的重新同步對應(yīng)需求 5setOperational(bool)整體啟?!房谑?lián)時所有燈同時停用恢復時再統(tǒng)一重啟。注意構(gòu)造函數(shù)與析構(gòu)函數(shù)的管理方式Intersection擁有其signals的所有權(quán)析構(gòu)時逐一delete避免內(nèi)存泄漏Intersection.cpp。這是 C LLD 實現(xiàn)中必須交代的資源管理細節(jié)。4.3 系統(tǒng)級中央控制TrafficSystemTrafficSystem.hpp 承擔 README 中TrafficController的中央控制職責createIntersection()創(chuàng)建路口并自動生成 IDI1、I2……addSignal(intersectionId, green, yellow, red)向指定路口添加信號燈自動生成S1、S2……三色時長參數(shù)在此透傳是需求 3“時長可配置”的對外入口removeIntersection / removeSignal按 ID 刪除updateSystem(timeElapsed)驅(qū)動系統(tǒng)內(nèi)所有路口同步推進一個時間步setIntersectionStatus(id, operational)模擬緊急/故障事件需求 5synchronizeIntersection(id)故障恢復后的全路口信號同步。4.4 演示入口TrafficSystemDemoTrafficSystemDemo.cpp 完整演示了“建系統(tǒng) → 建路口 → 加信號燈 → 時間步模擬 → 故障/恢復”的端到端流程TrafficSystem system; Intersection* intersection1 system.createIntersection(); Signal* signal1 system.addSignal(intersection1-getIntersectionId(), 20, 5, 25); Signal* signal2 system.addSignal(intersection1-getIntersectionId(), 20, 5, 25); system.displaySystemStatus(); for (int i 0; i 10; i) { system.updateSystem(5); // 每 5 秒推進一個時間步 system.displaySystemStatus(); std::this_thread::sleep_for(std::chrono::seconds(1)); } // 模擬路口故障 system.setIntersectionStatus(intersection1-getIntersectionId(), false); // 恢復并重新同步 system.setIntersectionStatus(intersection1-getIntersectionId(), true); system.synchronizeIntersection(intersection1-getIntersectionId());這里給出了一個非常有價值的實踐要點時間步進time-stepping模擬。演示程序以updateSystem(5)的方式每步推進 5 秒Signal::updateSignal將timeRemaining減去 5歸零即切換顏色。真實系統(tǒng)中這個timeElapsed來自定時器或硬件時鐘LLD 階段用循環(huán) sleep_for模擬即可驗證狀態(tài)機正確性。五、可配置性設(shè)計默認值、參數(shù)傳遞與運行期調(diào)整原 README 需求 3 明確要求“duration of each signal should be configurable and adjustable”C 實現(xiàn)通過三處設(shè)計滿足構(gòu)造器默認參數(shù)Signal(signalId, green30, yellow5, red30)不傳時長也能用安全默認值初始化Signal.hpp創(chuàng)建期傳參TrafficSystem::addSignal(intersectionId, greenDuration, yellowDuration, redDuration)允許為不同方向配置差異化時長——例如主干道綠燈 40s、次干道綠燈 15sTrafficSystem.cpp運行期調(diào)整Signal::setDurations(green, yellow, red)支持動態(tài)修改并自動復位正是“根據(jù)實時交通狀況調(diào)整”的擴展點Signal.cpp。六、故障處理與恢復緊急情況的工程化落地需求 5 要求系統(tǒng)“檢測并處理緊急情況”。C 實現(xiàn)用“整體停擺 同步復位”兩階段模擬了這一場景setOperational(false)時Intersection將isOperational置 false 并級聯(lián)調(diào)用所有Signal::setWorking(false)updateSignal中if (!isWorking) return;直接短路所有信號燈凍結(jié)在安全狀態(tài)Intersection.cpp恢復時setOperational(true)后調(diào)用synchronizeSignals()所有燈統(tǒng)一復位到紅燈并重新開始計時避免恢復后各方向相位錯亂。這套“凍結(jié) → 復位 → 重啟”的流程可以無縫擴展為真正的緊急車輛優(yōu)先邏輯檢測到救護車接近時可將沖突方向置紅、讓出方向持續(xù)綠燈若干秒邏輯與setOperational完全同構(gòu)。七、編譯與運行倉庫為只讀資源請在本地復制 solutions/cpp/trafficsignalsystem/ 目錄后編譯運行。由于演示程序使用了std::thread與std::chrono需要 C11 及以上標準并鏈接 pthreadg -stdc11 TrafficSystemDemo.cpp Signal.cpp Intersection.cpp TrafficSystem.cpp -o traffic_demo -lpthread ./traffic_demo預期輸出包括初始系統(tǒng)狀態(tài)Number of Intersections: 1、路口I1下S1/S2兩個信號燈、10 個時間步內(nèi)每 5 秒推進的狀態(tài)變化、故障模擬后全部燈Not Working、恢復同步后回到RED的完整生命周期。八、擴展性討論向完整方案演進的方向原 README 需求 6 要求“可擴展”。結(jié)合倉庫參考類圖Observer/State 模式與 C 實現(xiàn)可以給出以下演進路徑供面試作答與后續(xù)學習使用觀察者模式Observer參考類圖中TrafficLight維護ListTrafficObserverCentralMonitor實現(xiàn)update(intersectionId, direction, color)接收全系統(tǒng)信號變更。C 實現(xiàn)可用std::vectorstd::functionvoid(...)或自定義觀察者接口為Signal增加通知能力實現(xiàn)集中監(jiān)控與日志狀態(tài)模式State參考類圖中SignalState/IntersectionState接口將每個顏色的行為封裝為獨立類GreenState/RedState/YellowState可在此之上為綠燈疊加“動態(tài)延長”策略方向與多路口聯(lián)網(wǎng)參考設(shè)計用Direction { NORTH, EAST, WEST, SOUTH }建模四向路口并讓TrafficControlSystemSingleton持有多個IntersectionController實現(xiàn)綠波帶協(xié)調(diào)——C 的TrafficSystem已經(jīng)具備多路口容器只需補上方向枚舉與相位協(xié)調(diào)算法即可??偨Y(jié)交通信號控制系統(tǒng)是一道“小而全”的 LLD 經(jīng)典題。通過 solutions/cpp/trafficsignalsystem/README.md 的需求與類設(shè)計以及 Signal.cpp、Intersection.cpp、TrafficSystem.cpp 的源碼可以看到一條清晰的設(shè)計主線枚舉建模狀態(tài) → 實體封裝配置 → 路口聚合管理 → 系統(tǒng)級中央控制對應(yīng) Singleton→ 時間步進模擬驗證 → 故障凍結(jié)與恢復同步。掌握這套從需求到類圖再到 C 落地的完整鏈路你可以將其遷移到信號燈之外的任何“有限狀態(tài) 可配置時長 中央調(diào)度”類系統(tǒng)設(shè)計中。贊分享示例工程【免費下載鏈接】awesome-low-level-designLearn Low Level Design (LLD) and prepare for interviews using free resources.項目地址https://gitcode.com/GitHub_Trending/aw/awesome-low-level-design點擊查看免費下載相關(guān)推薦基于 C 的數(shù)字錢包系統(tǒng)低層設(shè)計LLD從需求建模到源碼實現(xiàn)基于 C 的數(shù)字錢包系統(tǒng)低層設(shè)計LLD從需求建模到源碼實現(xiàn) 本文以 awesome low level design 倉庫中 solutions/cp示例工程react-use 的 useVibrate一行 Hook 調(diào)用設(shè)備振動 API為 Web 應(yīng)用注入觸覺反饋react use 的 useVibrate一行 Hook 調(diào)用設(shè)備振動 API為 Web 應(yīng)用注入觸覺反饋 useVibrate 是 react use示例工程交通信號控制系統(tǒng)設(shè)計從需求分析到狀態(tài)機、觀察者與單例模式的多語言 LLD 實戰(zhàn)交通信號控制系統(tǒng)設(shè)計從需求分析到狀態(tài)機、觀察者與單例模式的多語言 LLD 實戰(zhàn) 本篇技術(shù)指南以 awesome low level design 倉庫中的 交示例工程上一篇如何高效使用CH55xduino3步打造低成本USB微控制器項目下一篇PostgreSQL-Async: 異步訪問 PostgreSQL 數(shù)據(jù)庫的 Scala 庫創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考