0

0

在Java里如何实现一个简单的酒店管理系统_Java面向对象设计解析

P粉602998670

P粉602998670

发布时间:2026-02-05 12:53:48

|

461人浏览过

|

来源于php中文网

原创

Java酒店管理系统应以准确建模现实概念为核心:Room与RoomType分离,Room持RoomType引用;Booking用状态枚举封装流转;Hotel仅聚合协调,不越权处理业务逻辑与IO。

在java里如何实现一个简单的酒店管理系统_java面向对象设计解析

Java里实现一个简单的酒店管理系统,核心不是堆砌功能,而是把「房型、房间、客人、订单」这些现实概念准确映射成类,并让它们之间用合适的关系协作。不搞清职责边界和对象生命周期,后面加个退房逻辑都能绕晕自己。

Room 和 RoomType 必须分离,别把房型信息硬塞进 Room 实例

常见错误是把 roomType 写成字符串或枚举字段,导致无法动态调整价格、床型、最大入住人数等属性。正确做法是让 Room 持有对 RoomType 的引用:

public class Room {
    private String roomNumber;
    private RoomType type; // ← 关键:引用而非复制
    private boolean isOccupied;
    
    public Room(String roomNumber, RoomType type) {
        this.roomNumber = roomNumber;
        this.type = type; // 同一房型下所有房间共享 price、bedCount 等
    }
    
    public double getPricePerNight() {
        return type.getPricePerNight(); // 逻辑集中到 RoomType
    }
}
  • RoomType 应包含 pricePerNightbedCountamenities 等可配置属性,支持后期按季节/活动调整
  • 避免在 Room 中重复存储价格——否则改一个房型的价就得遍历所有房间实例
  • 如果房型需唯一标识(如用于数据库),给 RoomTypeid 字段,别用名称做主键

Booking 类必须封装状态流转,别用布尔字段模拟业务过程

isConfirmed + isCheckedIn + isCanceled 这类平行布尔字段,很快会陷入状态组合爆炸(比如 isConfirmed=false, isCheckedIn=true 是什么合法状态?)。应该用枚举驱动状态机:

public enum BookingStatus {
    PENDING, CONFIRMED, CHECKED_IN, CHECKED_OUT, CANCELED
}
  • Booking 类内只暴露 confirm()checkIn()cancel() 等方法,每个方法校验前置状态并更新 status
  • 例如 checkIn() 只允许从 CONFIRMED 转入,否则抛 IllegalStateException
  • 取消订单时,要联动释放 Room 占用状态,这个逻辑不能散落在调用处,必须封装在 Booking.cancel() 内部

不要让 Hotel 类变成上帝对象,它只负责聚合和协调

新手常把查房、下单、生成账单全塞进 Hotel 类,结果这个类几百行还带一堆静态工具方法。正确职责是:

超能文献
超能文献

超能文献是一款革命性的AI驱动医学文献搜索引擎。

下载

立即学习Java免费学习笔记(深入)”;

  • 持有 ListListMap 等核心集合
  • 提供 findAvailableRooms(LocalDate, LocalDate) 这类组合查询——但具体日期冲突判断交给 Booking 自己的 overlapsWith(Booking other) 方法
  • 不处理 IO:读取初始房型数据、保存订单记录,应交给独立的 RoomRepositoryBookingDao,哪怕只是内存 Map 实现
  • 避免在 Hotel 里写格式化输出逻辑(如打印账单),那是 BookingPrinter 或视图层的事

真正难的不是写完增删改查,而是当运营提出「会员订房享95折,但仅限工作日」时,你能否在不碰 RoomHotel 的前提下,只改 Booking 的价格计算逻辑。面向对象设计的好坏,这时候才露出来。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

584

2023.08.02

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

55

2025.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

381

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1507

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

630

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

758

2024.03.22

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.2万人学习

C# 教程
C# 教程

共94课时 | 8.6万人学习

Java 教程
Java 教程

共578课时 | 57.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号