ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

航空管理系统 LLD 实战:基于 awesome-low-level-design 的 Java 领域建模与完整实现解析

航空管理系统 LLD 实战:基于 awesome-low-level-design 的 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点击查看免费下载本篇文章以 solutions/java/src/airlinemanagementsystem/README.md 为骨架结合仓库内完整的 Java 源码系统讲解航空管理系统Airline Management System的低层设计LLD思路从问题陈述、需求分析到核心实体识别、类设计、UML 建模再到可运行的示例代码与扩展方向。读者学完后将能够独立搭建一个涵盖航班、飞机、座位、乘客、预订与支付六大模块的航空业务系统并理解其背后单例、状态机等设计模式的落地方式。问题陈述与需求分析问题陈述Design and implement an Airline Management System that allows users to book flights, manage passengers, handle seat assignments, process payments, and track bookings and flights.即设计并实现一个航空管理系统支持用户预订航班、管理乘客、处理座位分配、处理支付并跟踪预订与航班状态。这是面试中经典的领域建模题目考察的是对真实业务实体、实体关系与业务状态流转的抽象能力。需求要点原文档明确列出了七条核心需求它们是整个类设计的输入需求说明航班管理每个航班拥有唯一航班号、关联飞机、出发地、目的地与时刻表飞机管理每架飞机有型号model与一组座位seats座位管理系统为每个航班管理座位分配与可用性乘客管理乘客可被新增、更新并与预订关联预订管理用户可预订航班系统跟踪预订、已分配座位与乘客支付处理系统为预订处理支付可扩展性易于扩展忠诚度计划、餐食选择、多航段旅程等新特性面向对象设计原则的体现从源码结构看本实现遵循了几个典型的 LLD 原则单一职责Flight只关注航班本身Seat只负责座位状态BookingManager独立管理预订生命周期封装座位状态、预订状态均通过方法reserve()/release()/cancel()改变外部不能直接改写领域包划分源码按业务域组织为flight/、seat/、booking/、payment/四个子包外加根包下的Aircraft、Passenger、AirlineManagementSystem职责边界清晰。核心实体设计原文档给出了七大核心实体它们在仓库源码中均有对应类实体所在路径职责AirlineManagementSystemAirlineManagementSystem.java门面入口统一管理航班、乘客、预订与支付Flightflight/Flight.java航班含航班号、飞机、起降地、时刻与座位AircraftAircraft.java飞机含尾号、型号与总座位数Seatseat/Seat.java座位含座位号、舱位类型与可用状态PassengerPassenger.java乘客含 ID、姓名与邮箱Bookingbooking/Booking.java预订关联乘客、航班、座位与价格Paymentpayment/Payment.java支付交易含支付 ID、方式、金额与状态实体关系从源码可以确认实体之间的聚合与关联关系Flight聚合Aircraft并持有MapString, Seat座位表与ListSeat availableSeats可用座位缓存Aircraft在构造时按totalSeats建立座位集合见 Aircraft.java 构造逻辑Booking关联一个Flight、一个Passenger、一个SeatPayment独立于Booking由PaymentProcessor统一处理。类设计详解1. AirlineManagementSystem门面类原文档描述的字段为ListFlight flights, ListBooking bookings, ListPassenger passengers, PaymentProcessor paymentProcessor。仓库实现进一步演进为以 Map 为主、以服务类为辅的架构private final MapString, Flight flights; private final MapString, Aircraft aircrafts; private final MapString, Passenger passengers; private final FlightSearch flightSearch; private final BookingManager bookingManager; private final PaymentProcessor paymentProcessor;关键方法与 AirlineManagementSystem.java 对应方法作用addPassenger(name, email)创建乘客并登记返回乘客对象addAircraft(tailNumber, model, totalSeats)以尾号登记飞机addFlight(source, destination, departure, arrival, aircraftNumber)创建航班并加入搜索索引searchFlights(source, destination, date)委托FlightSearch按条件检索bookFlight(flightNumber, passengerId, seat, price)委托BookingManager创建预订cancelBooking(bookingNumber)委托BookingManager取消预订processPayment(payment)委托PaymentProcessor处理支付值得注意的是bookFlight返回类型为Booking可空调用方需判空而原文档示例中的bookFlight(Passenger, Flight, Seat, Payment)签名在仓库中演化为按 ID 引用这样更贴近真实系统的解耦风格。2. Flight航班源码中Flight的字段为private final String flightNumber; // UUID 生成保证唯一 private final String source; private final String destination; private final LocalDateTime departureTime; private final LocalDateTime arrivalTime; private final FlightStatus status; // ON_TIME / DELAYED / CANCELLED private final Aircraft aircraft; private final MapString, Seat seats; private final ListSeat availableSeats;与文档字段String flightNumber, Aircraft aircraft, String source, String destination, Date schedule, ListSeat seats相比仓库实现将时间细化为了departureTime与arrivalTime两个LocalDateTime并新增了FlightStatus状态机便于后续支持延误、取消等真实场景。座位管理的关键是并发安全isSeatAvailable、reserveSeat、releaseSeat全部以synchronized修饰见 flight/Flight.java防止同一座位被并发重复预订。3. Aircraft飞机private final String tailNumber; // 机尾编号作为唯一标识 private final String model; // 如 Boeing 747、Airbus A380 private final int totalSeats; // 总座位数注意文档中Aircraft描述为model seats仓库实现则以tailNumber作为注册键totalSeats决定座位数量见 Aircraft.java。4. Seat座位private final String seatNumber; private final SeatType type; // ECONOMY / PREMIUM_ECONOMY / BUSINESS / FIRST_CLASS private SeatStatus status; // AVAILABLE / RESERVED / OCCUPIED见 SeatStatusreserve()将状态置为RESERVEDrelease()将状态置回AVAILABLEisBooked()用synchronized保证读安全判断是否为OCCUPIED见 seat/Seat.java。5. Passenger乘客字段为idUUID、name、email。与文档的int id, String name, String contactInfo相比仓库实现将 ID 改为 UUID 字符串联系方式收敛为email更贴合现代系统。6. Booking预订private final String id; private final Flight flight; private final Passenger passenger; private final Seat seat; private final double price; private BookingStatus status; // CONFIRMED / CANCELLED / PENDING / EXPIREDcancel()方法在将状态置为CANCELLED的同时调用seat.release()释放座位见 booking/Booking.java体现了座位资源与预订状态的一致性维护——这是预订系统的关键设计点。7. Payment 与 PaymentProcessor支付public class Payment { private final String paymentId; private final String paymentMethod; // 如 CREDIT_CARD private final double amount; private PaymentStatus status; // PENDING / COMPLETED ... }Payment.processPayment()完成支付逻辑并将状态置为COMPLETED见 payment/Payment.javaPaymentProcessor以单例模式封装处理入口见 payment/PaymentProcessor.java。8. BookingManager 与 PaymentProcessor单例模式落地仓库中BookingManager与PaymentProcessor均采用双重用途的单例模式——getInstance()方法加synchronized私有构造函数确保全局唯一public static synchronized BookingManager getInstance() { if (instance null) { instance new BookingManager(); } return instance; }预订创建与取消操作在synchronized(lock)块内执行见 booking/BookingManager.java避免并发下 Map 数据竞争。UML 类图仓库根目录提供了与本主题强相关的类图该图直观展示了AirlineManagementSystem与Flight、Aircraft、Passenger、Booking、Payment等实体之间的聚合与关联关系可作为面试讲解时的辅助图示。示例用法与 Demo原文档示例代码原文档给出了最简演示流程AirlineManagementSystem system new AirlineManagementSystem(); Aircraft aircraft new Aircraft(Boeing 737, seatList); Flight flight new Flight(AI101, aircraft, DEL, BOM, new Date(), seatList); system.addFlight(flight); Passenger alice new Passenger(1, Alice, aliceemail.com); system.addPassenger(alice); Seat seat flight.getAvailableSeats().get(0); Payment payment new Payment(1, 5000.0, CREDIT_CARD); system.bookFlight(alice, flight, seat, payment);仓库真实 Demo 流程仓库中的 AirlineManagementSystemDemo.java 展示了更贴近实际 API 的完整调用链对应五个步骤创建乘客addPassenger(John Doe, johnexample.com)注册飞机addAircraft(A001, Boeing 747, 300)300 座创建航班addFlight(New York, London, departureTime, arrivalTime, A001)时刻用LocalDateTime.now().plusDays(1)模拟次日起飞搜索航班searchFlights(New York, London, LocalDate.now().plusDays(1))预订与取消bookFlight(flight1.getFlightNumber(), passenger1.getId(), new Seat(25A, SeatType.ECONOMY), 100)随后cancelBooking(booking.getId())释放座位。其中FlightSearch.searchFlights使用流式过滤完成三条件匹配出发地、目的地、日期见 flight/FlightSearch.java是理解搜索链路的关键实现。可运行性说明本实现基于 Java 8使用java.timeAPI无第三方依赖可直接编译运行进入 solutions/java/src 目录将airlinemanagementsystem包加入 classpath 后执行AirlineManagementSystemDemo即可看到搜索、预订、取消的完整输出。这是仓库所有 LLD 题目的统一 Java 组织方式便于面试前快速演示。扩展方向框架的可扩展性原文档最后给出了三个扩展方向结合源码可给出具体落点忠诚度计划Loyalty Program可在Passenger上增加积分字段或在Payment完成后增加积分回写钩子不侵入现有Booking核心链路餐食选择Meal Selection为Booking增加可选的mealPreference属性或在BookingManager.createBooking中增加可选参数重载多航段旅程Multi-leg Journey将Booking与Flight的一对一关系演进为Booking持有ListFlight同时让Flight支持中转衔接字段。从源码结构看AirlineManagementSystem已把所有业务委托给FlightSearch、BookingManager、PaymentProcessor三个独立服务新增上述功能只需替换或扩展对应服务无需改动门面调用方——这正是本设计预留的扩展点。小结通过本文可以掌握一条完整的 LLD 落地链路需求分析 → 实体识别 → 类设计 → 状态建模 → 门面服务分层 → 并发安全 → 可运行 Demo → 扩展预留。仓库中该题的完整源码位于 solutions/java/src/airlinemanagementsystem配合 class-diagrams/airlinemanagementsystem-class-diagram.png 类图可作为面试复习的高质量参照同一仓库还提供了 C、C#、Go 等语言的对应实现便于横向对比各语言的领域建模风格。赞分享示例工程【免费下载链接】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点击查看免费下载相关推荐用 Go 设计航空管理系统基于 awesome-low-level-design 的 LLD 实战与单例并发实现解析用 Go 设计航空管理系统基于 awesome low level design 的 LLD 实战与单例并发实现解析 导读 本篇技术指南以开源仓库 aweso示例工程设计外卖配送系统Food Delivery Service基于 awesome-low-level-design 的完整 LLD 实战解析设计外卖配送系统Food Delivery Service基于 awesome low level design 的完整 LLD 实战解析 导读 本文以示例工程在线拍卖系统低层设计LLD实战基于 awesome-low-level-design 的 C 实现全解析在线拍卖系统低层设计LLD实战基于 awesome low level design 的 C 实现全解析 本篇技术指南以 awesome low le示例工程上一篇如何快速配置vJoy虚拟手柄5个步骤让键盘变专业游戏控制器下一篇5分钟掌握DLSS Swapper开源游戏性能优化终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表