)
示例工程【免费下载链接】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点击查看免费下载本文以 awesome-low-level-design 仓库中酒店管理系统Hotel Management System的设计文档为核心完整讲解该系统在面试场景下的需求拆解、类/接口/枚举建模并结合仓库内 C#、Go、C、Java 的多语言实现源码剖析其并发控制、支付多态与单例架构的落地方式。读完本文你将掌握一套可复用的预订—入住—退房—支付领域模型设计方法并能在任意面向对象语言中独立实现一个并发安全的酒店管理系统。需求分析把模糊业务翻译成可设计的边界关联文档 给出的需求清单共 8 条是本题与 problems/hotel-management-system.md 同源的设计起点。逐条拆解可以得到四个核心业务域预订与入住/退房主流程系统需要支持客人预订房间、办理入住check-in与退房check-out这是整个系统的主干用例房型与状态管理需要管理多种房型single、double、deluxe、suite并维护房间的可用性availability与预订状态reservation status人员与账务管理酒店员工需要维护客人信息guest information、房间分配room assignments与账单billing支付能力支持多种支付方式如现金cash、信用卡credit card与在线支付online payment。剩下两条是典型的非功能性需求同样是 LLD 面试的加分点需求 6 要求处理并发预订并保证数据一致性handle concurrent bookings and ensure data consistency需求 7/8 要求可扩展、可承载大量房间与客人。它们分别对应到本文后续要讲的两类设计决策——锁与并发容器、单例与可扩展分层架构。从仓库实现看这一需求模型被多语言版本一致采纳Go 版在 types.go 中用三个枚举精确复刻了房型、房间状态与预订状态C# 版在 HotelManagementSystem.cs 中把并发一致性落到了ConcurrentDictionary与lock上Java 版则在 solutions/java/src/hotelmanagementsystem 目录下通过factory、state、observer、specification等子包体现了可扩展的架构取向。核心模型类、接口与枚举的职责划分设计文档给出了 9 个核心建模元素它们构成了完整且自洽的领域模型Guest客人持有 ID、姓名、邮箱、电话等属性是预订与账单的主体Room房间持有 ID、房型、价格、状态等属性并提供book、check-in、check-out方法——房间自身管理自己的生命周期状态RoomType枚举描述可用房型。Go 实现中依次为RoomTypeSingle、RoomTypeDouble、RoomTypeDeluxe、RoomTypeSuite从iota开始编号RoomStatus枚举表示房间状态取值为 available可用、booked已预订、occupied已入住三态Reservation预订表示某客人 × 某房间 × 某日期区间的预订记录持有 ID、guest、room、入住日期、退房日期与状态并提供cancel方法ReservationStatus枚举表示预订状态取值为 confirmed已确认或 cancelled已取消Payment接口定义支付处理契约由CashPayment、CreditCardPayment等具体类实现——这是教科书式的面向接口编程HotelManagementSystem门面/单例系统的中枢组件采用 Singleton 模式保证全局唯一实例对外提供 add guests、add rooms、book rooms、cancel reservations、check-in、check-out、process payments 等能力并通过同步机制处理共享资源的并发访问HotelManagementSystemDemo演示类串起创建客人 → 创建房间 → 预订 → 入住 → 退房 → 取消预订的完整使用链路。这里有一个值得注意的建模原则房间状态RoomStatus与预订状态ReservationStatus是两套独立的枚举不能混用。房间关心的是物理上能否被占用预订关心的是这笔订单是否有效二者通过Reservation中的room引用和HotelManagementSystem的流程编排联动。Go 的 types.go 将这两组枚举分开定义正是对这一设计决策的忠实落地。支付的多态设计以 Payment 接口统一多种支付方式需求 5 要求支持现金、信用卡、在线支付等多种方式这在 LLD 中几乎必然会落到策略模式/接口多态上。设计文档明确Payment是接口CashPayment与CreditCardPayment是其具体实现仓库中 C# 目录solutions/csharp/hotelmanagementsystem下的CashPayment.cs、CreditCardPayment.cs、Payment.cs与 Java 目录下的 payment 子包 都保持了同样的结构。这种设计的直接收益体现在退房结算环节。以 C# 的 HotelManagementSystem.cs 为例CheckOut方法接受的是Payment抽象类型而非具体支付类public void CheckOut(string reservationId, Payment payment) { lock (this) { if (_reservations.TryGetValue(reservationId, out var reservation) reservation.Status ReservationStatus.CONFIRMED) { var room reservation.Room; var amount room.Price * (reservation.CheckOutDate - reservation.CheckInDate).TotalDays; if (payment.ProcessPayment(amount)) { room.CheckOut(); _reservations.TryRemove(reservationId, out _); } else { throw new InvalidOperationException(Payment failed.); } } ... } }从这段源码可以读出三个实现细节计费公式为房单价 × 入住天数Price × (CheckOut - CheckIn).TotalDays支付结果决定流程走向——只有ProcessPayment返回成功才会触发房间退房并移除预订记录失败则抛出异常调用方可以在运行时自由传入任意 Payment 实现后续新增在线支付online payment只需增加一个OnlinePayment类即可无需改动CheckOut逻辑。这就是面向接口编程在真实代码中的价值。并发与数据一致性锁与并发容器的落地需求 6 是本题最容易与普通CRUD 作业拉开差距的地方。设计文档指出HotelManagementSystem使用同步机制处理共享资源并发访问仓库的多语言实现给出了三种典型落地方式C# 版HotelManagementSystem.cs采用并发容器 细粒度锁组合三个共享集合_guests、_rooms、_reservations均为ConcurrentDictionarystring, T以 ID 为键天然支持并发读写单例通过私有构造函数 静态Instance属性实现if (_instance null) _instance new HotelManagementSystem();BookRoom对具体房间对象加锁lock (room)先检查room.Status RoomStatus.AVAILABLE再执行预订保证查状态—改状态的原子性避免两个客人同时订到同一间房CheckIn、CheckOut、CancelReservation则对系统实例加锁lock (this)并校验ReservationStatus.CONFIRMED前置条件校验失败时抛出InvalidOperationException。这种锁对象越具体、并发度越高的思路值得在面试中展开对房间加锁允许不同房间的预订并行进行而对整个系统加锁则退化为串行是并发正确性与吞吐量之间的经典取舍。Go 版同样面临并发问题其 types.go 负责定义状态枚举配合 hotel_management.go 中的领域逻辑共同构成服务层是理解 Go 版并发控制的入口文件。Go 的常规做法是使用sync.Mutex保护共享状态面试时可以在 C# 版对比之下顺势讨论两种语言在并发原语上的差异。多语言实现对照同一模型的四种表达仓库为该问题提供了 Python、Java、C、C#、Go 五条实现路径各版本 README 内容保持一致见 solutions/cpp/hotelmanagementsystem/README.md、solutions/csharp/hotelmanagementsystem/README.md、solutions/golang/hotelmanagementsystem/README.md非常适合横向对照学习C#ConcurrentDictionarylock处理并发HotelManagementSystem.Instance单例文件结构为Guest.cs、Room.cs、Reservation.cs、Payment.cs、RoomType.cs、RoomStatus.cs、ReservationStatus.cs加两个系统类Gotypes.go 集中定义RoomType、RoomStatus、ReservationStatus三个基于int的枚举iota起始room.go、reservation.go、guest.go、payment.go各自成文件hotel_management_demo.go承担演示入口C以Booking.hpp/cpp、Guest.hpp/cpp、Room.hpp/cpp、HotelManager.hpp/cpp组织命名上把 Reservation 称作 Booking门面类为HotelManagerJava最完整的工程化版本solutions/java/src/hotelmanagementsystem不仅实现了基础模型model包中的Guest、Room、Booking还额外引入了decorator房型附加服务、factoryRoomFactory创建房间、stateAvailableState/OccupiedState/MaintenanceState房间状态机、observerEmailNotifier/SmsNotifier通知、specificationRoomAvailableSpecification等预订条件组合五个设计模式包并配以BookingService、RoomService、PaymentService、HotelManagerFacade的分层服务架构Python当前 solutions/python/hotelmanagementsystem 目录只包含设计文档 README即本文主体所依据的 README.md暂未提供.py实现文件——读者可先对照本文的类模型再参考 C#/Go 版将其改写为 Python 的dataclass 单例 多态支付实现是很好的编码练习。另外problems/hotel-management-system.md 中提供了该系统的 UML 类图图中完整呈现了HotelManagementSystem、Guest、Room、Reservation及各枚举、支付实现之间的关联关系适合在设计阶段先构图、再编码。演示流程一个完整的业务闭环HotelManagementSystemDemo的职责是串起全部主流程。参照 Java 版 README 的示例用法标准调用序列如下HotelManagementSystem system new HotelManagementSystem(); // 添加房间 Room room system.addRoom(101, RoomType.DELUXE, 150.0); // 创建客人 Guest guest new Guest(John Doe, johnexample.com, 1234567890); // 预订 Reservation reservation system.makeReservation(guest, room, checkInDate, checkOutDate); // 入住 system.checkIn(reservation); // 退房携带支付对象走 Payment 多态 system.checkOut(reservation);对照 C# 源码这个流程的每一步都有对应的状态迁移与并发保护BookRoom在锁内将房间从AVAILABLE置为BOOKED并生成预订 IDC# 实现为RES Guid.NewGuid().ToString(N).Substring(0, 8).ToUpper()即RES前缀加 8 位大写十六进制CheckIn要求预订状态为CONFIRMED才将房间置为OCCUPIEDCheckOut则在支付成功后释放房间并移除预订。流程边界清晰、状态流转可追踪这正是面试官期待的可运行、可验证的设计。扩展方向从 MVP 走向生产级系统Java 版 README 给出了六条典型的演进路线可作为 LLD 面试如何扩展环节的素材房间服务room service记录服务请求与配送客房保洁housekeeping管理保洁排班与任务会员积分loyalty program实现客人积分与奖励库存管理inventory management跟踪酒店物资与备品报表系统reporting生成入住率与营收报表呼应需求 7 的分析功能通知系统notification发送预订确认与提醒——Java 版已内置observer包作为该能力的基础。这些扩展大多可以挂到既有的HotelManagementSystem门面上新增服务类或以设计模式包的形式Java 版的做法增量引入不会破坏核心预订链路——这也是门面 领域模型架构可扩展性的直接体现。小结酒店管理系统是一道覆盖全面、难度适中的经典 LLD 题目需求层面横跨预订、状态机、支付、并发四大主题设计层面涉及枚举建模、接口多态、单例与锁实现层面则可以横跨 Java、C#、C、Go、Python 多种语言对比学习。以 solutions/python/hotelmanagementsystem/README.md 的 9 元素类模型为骨架结合 C# 版的并发细节、Go 版的枚举定义、Java 版的设计模式扩展你完全可以拼装出一套既能在面试中讲清原理、又能在任何语言中亲手实现的完整方案。赞分享示例工程【免费下载链接】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点击查看免费下载相关推荐Pub/Sub 系统低层设计实战从需求拆解到 Java 异步并发实现awesome-low-level-designPub/Sub 系统低层设计实战从需求拆解到 Java 异步并发实现awesome low level design 导读 本文以 awesome low示例工程酒店管理系统Hotel Management System低层设计实战基于 awesome-low-level-design 的 C 全流程实现解析酒店管理系统Hotel Management System低层设计实战基于 awesome low level design 的 C 全流程实现解析示例工程Snake and Ladder Game 低层设计实战从需求拆解到多会话并发架构awesome-low-level-designSnake and Ladder Game 低层设计实战从需求拆解到多会话并发架构awesome low level design 本文以 awesome示例工程上一篇如何用PKHeX自动合法性插件轻松管理宝可梦数据合规性下一篇如何用PKHeX自动合法性插件彻底解决宝可梦数据合规难题3步实现100%合法宝可梦生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考