You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:26:26