Java简易酒店管理系统设计难题及优化实现方案
关于简易酒店管理系统的设计改进建议
首先得说,你原来把房间可用性存在main方法里的HashMap这个设计确实不太合理——房间的可用状态本质上是房间对象自身的属性,不该放在外部容器里,不然Room类自己都没法直接获取自己的状态,完全违背了面向对象的封装原则。而且Guest预订房间的逻辑也需要和Room的状态、两者的关联关系结合起来,下面给你梳理下修改思路和最终可运行的代码:
原设计的核心问题
- Room类无法访问main里的HashMap,导致
isAvailable方法根本没法工作 - 房间的可用性状态脱离了Room对象本身,不符合面向对象的"对象封装自身属性和行为"的思想
- Guest和Room之间的关联关系没有体现(比如哪个客人住哪个房间)
修改后的完整实现
1. Room类(重构后)
把可用性状态、入住客人作为Room自身的属性,同时封装所有字段的getter/setter,让Room自己管理自身的状态:
public class Room { public enum RoomType { ONE_BEDRM, TWO_BEDRM, THREE_BEDRM, PENTHOUSE } private boolean available; private Guest occupant; private int roomNum; private double price; private RoomType type; public Room(int roomNum, double price, RoomType type) { this.roomNum = roomNum; this.price = price; this.type = type; this.available = true; // 房间默认创建时是可用的 } public boolean isAvailable() { return this.available; } public void setAvailable(boolean available) { this.available = available; } public Guest getOccupant() { return occupant; } public void setOccupant(Guest occupant) { this.occupant = occupant; } // 其他getter/setter方法 public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public RoomType getRoomType() { return type; } public void setRoomType(RoomType type) { this.type = type; } public int getRoomNumber() { return roomNum; } public void setRoomNumber(int roomNum) { this.roomNum = roomNum; } }
2. Guest类(重构后)
添加和Room的关联属性,修改checkIn/checkOut逻辑,让Guest可以和Room交互完成预订/退房,同时增加获取房间信息的方法:
public class Guest { private String name; private boolean checkedIn; private Room occupiedRoom; public Guest(String name) { this.name = name; this.checkedIn = false; // 默认未入住 } // 入住逻辑:只有未入住且房间可用时,才能完成入住 public void checkIn(Room room) { if (!this.checkedIn && room.isAvailable()) { this.checkedIn = true; this.occupiedRoom = room; room.setAvailable(false); room.setOccupant(this); } } // 退房逻辑:只有已入住时才能退房 public void checkOut() { if (this.checkedIn) { this.checkedIn = false; this.occupiedRoom.setAvailable(true); this.occupiedRoom.setOccupant(null); this.occupiedRoom = null; } } // 获取房间信息的方法 public void showOccupiedRoomInfo() { if (this.occupiedRoom != null) { System.out.println("Room # : " + this.occupiedRoom.getRoomNumber()); System.out.println("Room price : " + this.occupiedRoom.getPrice()); System.out.println("Room type : " + this.occupiedRoom.getRoomType()); System.out.println("Room occupant : " + this.name); } else { System.out.println("You haven't checked in any room yet."); } } // 其他getter/setter方法 public boolean isCheckedIn() { return checkedIn; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Room getOccupiedRoom() { return occupiedRoom; } }
3. Main函数(测试逻辑)
简化测试流程,直接通过对象交互完成入住、查看信息的操作:
public class HotelManagementSystem { public static void main(String[] args) { Guest mike = new Guest("Mike"); Room oneBedroom1 = new Room(1001, 100.00, Room.RoomType.ONE_BEDRM); Room twoBedroom1 = new Room(2001, 200.00, Room.RoomType.TWO_BEDRM); // 查看房间初始状态 System.out.println("Room 1001 available: " + oneBedroom1.isAvailable()); // 客人入住房间 mike.checkIn(oneBedroom1); // 查看客人入住的房间信息 mike.showOccupiedRoomInfo(); // 客人退房 mike.checkOut(); System.out.println("\nAfter check out, Room 1001 available: " + oneBedroom1.isAvailable()); mike.showOccupiedRoomInfo(); } }
关键改进点总结
- 封装性优化:把房间的可用性、入住客人作为Room的内部属性,Room自己管理状态,符合面向对象设计原则
- 对象关联清晰:Guest和Room之间建立双向关联,客人知道自己住哪个房间,房间知道自己被哪个客人住
- 逻辑完整性:checkIn/checkOut方法增加了状态校验,避免不合理的操作(比如已入住的客人再次入住,未入住的客人退房)
内容的提问来源于stack exchange,提问作者asus
相关产品推荐
相关产品推荐

