尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于 Python 的航空管理系统低层设计(LLD):需求建模、核心类设计与线程安全单例实战

基于 Python 的航空管理系统低层设计(LLD):需求建模、核心类设计与线程安全单例实战 示例工程【免费下载链接】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/python/airlinemanagementsystem 的 Python 实现为核心完整还原航空管理系统Airline Management System这一经典低层设计LLD题目的需求分析、类职责划分与落地编码全过程。你将掌握如何用Flight / Aircraft / Passenger / Booking / Seat / Payment 六大领域模型支撑航班搜索、订票、支付、退票等核心业务流理解BookingManager与PaymentProcessor中**线程安全单例模式double-checked locking**的写法并通过可运行的 Demo 脚本airline_management_system_demo.py验证整条调用链。需求梳理航空管理系统要解决什么问题原文档README.md明确列出了 8 条功能需求它们是后续所有类设计的直接输入按航线与日期搜索航班用户依据出发地source、目的地destination和日期date检索可用航班订票、选座、支付完成从选航班、选座位到付款的全链路航班排班管理系统需要管理航班时刻表、机型aircraft分配与机组crew分配乘客信息管理包括个人资料与行李baggage信息多角色支持乘客passengers、航空公司员工airline staff、管理员administrators等不同用户类型取消、退款与改签支持订票取消、退款处理和航班变更数据一致性与并发控制保证共享资源如座位、库存在并发访问下的正确性可扩展性系统结构要能够承载未来新增功能。从需求到类映射关系非常直接需求 1 →FlightSearch需求 2 →Booking/Seat/Payment需求 7 → 基于threading.Lock的单例管理器。这种需求先行、类职责对齐的做法正是面试中回答 LLD 题目的标准范式。领域模型六大核心类与枚举原文档将系统划分为 10 个类/组件其中 6 个是纯数据领域模型在 Python 实现中一一对应如下文件Flight 与 Aircraft航班与机型flight.py 中的Flight承载航班号flight_number、出发地、目的地、起飞/到达时间并用available_seats列表维护可售座位集合aircraft.py 中的Aircraft用尾号tail_number、机型model与总座位数total_seats描述一架飞机。从代码看Flight通过暴露get_source()、get_destination()、get_departure_time()三个只读访问器支撑后续搜索逻辑符合封装原则。Passenger 与 Seat乘客与座位状态机passenger.py 的Passenger记录乘客 ID、姓名、邮箱、电话seat.py 则定义了本题的核心状态机SeatStatus枚举AVAILABLE可用、RESERVED已预留、OCCUPIED已占用SeatType枚举ECONOMY、PREMIUM_ECONOMY、BUSINESS、FIRST_CLASS四种舱位Seat提供reserve()将状态置为RESERVED、release()释放回AVAILABLE。这一座位即状态机的设计可以直接演进出更严格的并发选座先 RESERVED 抢占、支付成功后 OCCUPIED、取消后 AVAILABLE是后续扩展分布式锁/乐观锁的天然切入点。Booking 与 Payment交易状态枚举booking.py 的Booking关联订单号、航班、乘客、座位与价格并用BookingStatus枚举CONFIRMED/CANCELLED/PENDING/EXPIRED记录生命周期cancel()将状态置为CANCELLEDpayment.py 的Payment记录支付 ID、支付方式与金额PaymentStatus枚举包含PENDING、COMPLETED、FAILED、REFUNDEDprocess_payment()将状态从PENDING推进到COMPLETED。两套状态枚举完整支撑了预订→支付→取消/退款的业务闭环也为后续引入改签flight change与退款refund逻辑预留了清晰的状态扩展点。服务层FlightSearch 的搜索实现flight_search.py 将搜索逻辑独立成FlightSearch类构造函数接收航班列表search_flights(source, destination, date)使用列表推导式一次性完成三个条件的过滤出发地匹配flight.get_source().lower() source.lower()大小写不敏感目的地匹配flight.get_destination().lower() destination.lower()日期匹配flight.get_departure_time().date() datedatetime 转 date 后与查询日期比较。从源码结构看搜索当前采用 O(n) 线性扫描所有可售座位仍在Flight.available_seats中维护若要扩展为高并发生产系统可以推断出两条演进路径将座位库存迁出为独立服务以及为出发地-目的地-日期组合建立索引或倒排结构以加速检索。并发与单例BookingManager 与 PaymentProcessor需求 7 的数据一致性 并发控制由两个单例类落实这也是本题最有含金量的部分。线程安全单例的标准写法booking_manager.py 与 payment_processor.py 采用了经典的double-checked locking __new__覆写模式_instance None _lock Lock() def __new__(cls): if not cls._instance: # 第一次检查无锁快速路径 with cls._lock: if not cls._instance: # 第二次检查持锁防竞态 cls._instance super().__new__(cls) return cls._instance要点拆解第一层检查不加锁绝大多数调用直接走快速路径返回既有实例避免锁开销第二层检查在锁内确保多线程同时首次实例化时只有一个线程真正创建对象_lock是类级threading.Lock所有实例共享同一把锁天然线程安全。注意__init__中的self.bookings {}、self.booking_counter 0会在每次BookingManager()调用时重新执行因此业务代码中应统一通过AirlineManagementSystem持有单例并直接使用避免重复初始化清空数据——这是该模式在 Python 下的一个实践注意点。订票与取消的业务逻辑BookingManager.create_booking(flight, passenger, seat, price)的完整流程是_generate_booking_number()生成订单号先自增booking_counter再拼接当前时间戳产出BKG{YYYYMMDDHHMMSS}{序号:06d}格式如BKG20261001013000 000001保证同秒内并发订票也能获得唯一编号构造Booking对象初始状态CONFIRMED在锁内写入self.bookings[booking_number] booking保证字典写入的原子性。cancel_booking(booking_number)在锁内读取订单并调用booking.cancel()将状态翻转至CANCELLED。从源码看当前取消逻辑尚未释放Seat未调用seat.release()可推断这是预留的扩展点在生产系统中取消订票后应同步归还座位库存并触发退款流程。门面入口AirlineManagementSystem 组装全系统airline_management_system.py 的AirlineManagementSystem相当于整个系统的门面Facade与组合根持有flights、aircrafts两个列表以及flight_search、booking_manager、payment_processor三个服务组件add_flight()/add_aircraft()完成航班与机型的注册search_flights()委托FlightSearch执行搜索book_flight()委托BookingManager.create_booking()创建订单cancel_booking()委托BookingManager.cancel_booking()取消订单process_payment()委托PaymentProcessor驱动支付状态流转。这种单一门面 组件委托的结构让调用方只需面向AirlineManagementSystem一个入口同时各组件保持高内聚、低耦合可直接对应原文档第 10 条主入口类的定位。运行验证Demo 脚本演示完整业务流程airline_management_system_demo.py 提供了一个开箱即用的演示入口覆盖了从建数据到取消订单的完整生命周期准备基础数据创建乘客Passenger(U001, John Doe, ...)两个航班F001 纽约→伦敦、F002 巴黎→东京起飞时间基于datetime.now() timedelta(...)动态生成两架飞机Boeing 747、Airbus A380搜索航班以datetime.now().date() timedelta(days1)作为查询日期调用search_flights(New York, London, search_date)并打印命中结果订票创建经济舱座位Seat(25A, SeatType.ECONOMY)调用book_flight(flight1, passenger1, seat, 100)票价 100成功则打印订单号取消订单通过booking.booking_number调用cancel_booking()并输出取消确认。运行方式在仓库根目录下python3 solutions/python/airlinemanagementsystem/airline_management_system_demo.py预期输出大致为先打印 Search Results 中的 F001 航班再打印 Booking successful. Booking ID: BKG...最后打印 Booking cancelled.。这段脚本同时充当了整条调用链的可执行验证搜索 → 预订 → 取消与原文档 8 条需求中的 1、2、6 逐条对应。从 Python 版出发跨语言实现的横向参照同一题目在仓库中还有多语言实现可作为阅读本文后的延伸对照Java 实现C 实现C# 实现Go 实现Python 版以最小化代码呈现了领域建模与单例/门面两个核心模式Java 版通常以接口 具体类的方式进一步解耦如将PaymentProcessor抽象为支付接口以便扩展多支付渠道Go 版则通过结构体组合与包级单例呈现同样的结构。对照阅读可以直观感受到同一 LLD 题目在不同语言惯用法下的落地差异。结语本文覆盖的能力清单读完本文你已经掌握从 8 条需求到 10 个类/组件的一一映射方法可直接复用于面试中的 LLD 答题框架Flight/Aircraft/Passenger/Seat/Booking/Payment六类领域模型及四组状态枚举座位、舱位、订单、支付的设计要点基于threading.Lock的 double-checked locking 线程安全单例及其在BookingManager/PaymentProcessor中的实际运用FlightSearch的大小写不敏感搜索实现与可扩展方向AirlineManagementSystem门面类的组装方式以及可运行 Demo 的完整业务流程。如需进一步探索可阅读题目原文 problems/airline-management-system.md 及其 UML 类图 class-diagrams/airlinemanagementsystem-class-diagram.png将本篇文章的代码结构与其对照能更清晰地看到领域模型在图形化设计中的位置。赞分享示例工程【免费下载链接】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点击查看免费下载相关推荐Splitwise 低层设计LLD实战Python 分账系统的需求、类设计与并发策略全解析Splitwise 低层设计LLD实战Python 分账系统的需求、类设计与并发策略全解析 本文以 awesome low level design ht示例工程汽车租赁系统低层设计实战需求建模、核心类设计与 Python 实现深度解析汽车租赁系统低层设计实战需求建模、核心类设计与 Python 实现深度解析 本篇技术指南以 awesome low level design 仓库中 solu示例工程设计类似 Facebook 的社交网络系统需求建模、核心类设计与多语言 LLD 实战设计类似 Facebook 的社交网络系统需求建模、核心类设计与多语言 LLD 实战 本文以 awesome low level design 仓库中的 so示例工程上一篇三步搞定 iOS 虚拟定位无需越狱的免费跨平台方案下一篇Windows打不开iPhone照片HEIF Utility三步把HEIC转成JPEG创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表