Java面向对象实战:酒店管理系统设计与实现
本文演示如何使用Java面向对象思想开发一个简易的酒店管理系统,涵盖需求分析、数据结构设计及核心代码实现。重点展示了如何利用自定义注解与反射机制校验实体类属性,并通过二维数组管理房间状态,实现查看、预订和退订功能。
一、需求分析与架构设计
在开始编码前,需明确系统的核心业务逻辑与数据结构选择。本示例旨在通过简单的命令行交互展示Java面向对象编程的应用场景。
第1步:明确系统功能边界
酒店管理系统的核心操作包括以下四项:
- 查询房间:输入命令后显示当前所有房间的列表及其状态(空闲或已占用)。
- 房间预订:输入房间编号进行入住登记,若房间已占用则提示失败。
- 办理退房:输入房间编号进行结算离店,若房间未被占用则提示无需退订。
- 系统退出:输入特定命令安全关闭系统。
第2步:确定数据存储结构
考虑到现实酒店的物理布局通常为“楼层+房间号”的结构,使用二维数组来模拟最为直观。假设酒店共有5层楼,每层9间房,通过 Room[][] rooms 变量即可映射整个空间。
二、实体类与约束设计
为了保证代码的规范性和扩展性,我们需要定义房间实体类,并使用自定义注解对其实体结构进行静态约束。
第1步:定义房间属性实体类 (Room)
房间对象应包含三个基本字段:房间编号 (rId)、房间类型 (rType) 以及空闲状态 (rFree)。我们将使用自定义注解 @ProperyAnnotation 标记该类,表明它是一个受管理的房间实体。

第2步:编写自定义注解与校验逻辑
为了演示反射技术的使用,我们创建一个工具类 ProperyAnnotationToJudge,其作用是检查被标注的类是否严格具备上述三个关键属性。这在实际工程中可用于ORM框架的数据模型验证。
核心逻辑如下:
1. 使用 Class.forName() 加载目标类。
2. 调用 isAnnotationPresent() 确认注解存在。
3. 遍历 getFields() 获取所有字段,验证是否存在名为 rId(Integer)、rType(String) 和 rFree(Boolean) 的属性。若缺失任一属性,则抛出异常。

三、核心业务逻辑实现
Hotel 类作为控制器,负责初始化房间矩阵并处理具体的预订与退房请求。
第1步:初始化酒店房间矩阵
在 Hotel 构造函数中,实例化一个 [5][9] 的二维数组。循环遍历每个位置,根据楼层 (m) 和房间序号 (n) 计算自然编号,例如第一层第一个房间编号为 101。公式为:(m + 1) * 100 + n + 1。不同楼层可配置不同的房型(如单人豪华房、双人豪华房等),初始状态均设为空闲 (false,此处代码逻辑中需注意布尔值语义,示例中 false 代表无人入住/空闲,true 代表有人/已占,具体取决于setter/setter的实现对照)。
第2步:实现房间状态变更算法
为了实现根据“自然编号”(如101)快速定位数组索引,需要进行坐标转换:
- 楼层索引:
rId / 100 - 1 - 列索引:
rId % 100 - 1
预订流程:定位到对应 Room 对象,若其状态为空闲,则设置为“占用”,并打印成功提示;否则提示该房间已售罄。
退房流程:定位到对应 Room 对象,若其状态为“占用”,则重置为“空闲”,并打印成功提示;否则提示该房间未住人。
四、控制台交互与运行测试
主程序入口位于 Test 类的 main 方法中。系统启动时首先执行反射校验,确保 Room 类结构合法。随后进入 while(true) 循环,监听用户输入的功能编号:
第1步:菜单驱动的操作流程
- 输入 1: 调用
queryAllRooms()遍历二维数组,输出所有房间的当前状态。 - 输入 2: 进入预订模式,读取输入的房间号,执行合法性范围检查(101-510)后调用
makeRoom()。 - 输入 3: 进入退房模式,同样校验输入范围后调用
existRoom()。 - 输入 0: 退出循环,关闭Scanner资源,结束进程。
运行结果将直接在控制台打印出各操作的反馈信息,界面简洁清晰。如图所示:

五、总结
通过本例,我们不仅掌握了Java数组与面向对象的基础应用,还深入理解了自定义注解与反射技术在程序运行时的元数据校验作用。这种分层设计(实体、控制、测试)有助于培养良好的工程习惯。
以上就是Java酒店管理系统实现的详细内容,更多关于Java基础教程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













