【问题标题】:hotel management system design in javaJava中的酒店管理系统设计
【发布时间】:2020-01-03 10:40:10
【问题描述】:

我正在用 Java 设计一个简单的酒店管理系统,但我的设计卡住了。

在我的主要功能中,我创建了 2 个房间和一个客人。我希望来宾班能够bookRoom 和一个房间来检查它是否isAvailable

由于我没有使用任何数据库,我将房间存储在 HashMap 中,其中键是房间,值是布尔值,表示是否已预订。

我的房间类如何访问该哈希图?或者这是一种设计/思考问题的糟糕方式?

类似地,我的来宾类如何访问 bookRoom,它应该调用 isAvailable,这是一个 Room 方法。

任何建议将不胜感激!

客人

public class Guest {

  String name;
  boolean checkedIn;

  public Guest(String name) {
    this.name = name;
  }

  public void checkIn() {
    setCheckedIn(true);
  }

  public void checkOut() {
    setCheckedIn(false);
  }

  public boolean getStatus() {
    return checkedIn;
  }

  public void setCheckedIn(boolean checkedIn) {
    this.checkedIn = checkedIn;
  }

  public void bookRoom(String type) {
    // check if room of type x is available

    // if yes, create a guest booking

    // if no, return
  }
}

房间

public class Room {

  public enum roomType {
    ONE_BEDRM, TWO_BEDRM, THREE_BEDRM, PENTHOUSE
  }

  public int roomNum;
  public double price;
  public roomType type;

  public Room(int roomNum, double price, roomType type) {
    this.roomNum = roomNum;
    this.price = price;
    this.type = type;
  }

  public boolean isAvailable(Room room) {
    boolean available = availability.get(room); // problem here obviously cause hashmap is defined in main
    if (available) {
      return true;
    }
    return false;
  }

  public int getRoomNumber() {
    return roomNum;
  }
}

主要

    public static void main(String[] args) throws Exception {

        Guest mike = new Guest("mike");
        mike.checkIn();
        mike.getStatus();

        HashMap<Room, Boolean> availability = new HashMap<>();

        Room one_bedroom1 = new Room(1001, 100.00, Room.roomType.ONE_BEDRM);
        Room two_bedroom1 = new Room(2001, 200.00, Room.roomType.TWO_BEDRM);

        availability.put(one_bedroom1, true);
        availability.put(two_bedroom1, true);

    }

==========================解决方案================== =======

感谢所有在 cmets 中提供帮助的人!以下是我现在按预期进行的编辑:

房间

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;
  }

  public boolean isAvailable() {
    return this.available;
  }

  public boolean getAvailable() {
    return available;
  }

  public void setAvailable(boolean available) {
    this.available = available;
  }

  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;
  }

  public Guest getGuest() {
    return occupant;
  }

  public void setGuest(Guest occupant) {
    this.occupant = occupant;
  }

}

客人

public class Guest {

  private String name;
  private boolean checkedIn;
  private Room room;

  public Guest(String name) {
    this.name = name;
  }

  public void checkIn(Room room) {
    if (this.getStatus() == false) {
      this.setCheckedIn(true);
      this.setRoom(room);
    }
  }

  public void checkOut() {
    if (this.getStatus() == true) {
      this.setCheckedIn(false);
      this.setRoom(null);
    }
  }

  public boolean getStatus() {
    return checkedIn;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Room getRoom() {
    return room;
  }

  public void setRoom(Room room) {
    this.room = room;
  }

  public void setCheckedIn(boolean checkedIn) {
    this.checkedIn = checkedIn;
  }

  public void getRoomInfo(Room room) {
    System.out.println("Room # : " + room.getRoomNumber());
    System.out.println("Room price : " + room.getPrice());
    System.out.println("Room type : " + room.getRoomType());
    System.out.println("Room occupant : " + room.getGuest().getName());
  }
}

主要

    public static void main(String[] args) throws Exception {

        Guest mike = new Guest("mike");

        Room one_bedroom1 = new Room(1001, 100.00, Room.roomType.ONE_BEDRM);
        Room two_bedroom1 = new Room(2001, 200.00, Room.roomType.TWO_BEDRM);

        one_bedroom1.setAvailable(true);
        two_bedroom1.setAvailable(true);

        System.out.println(one_bedroom1.isAvailable());

        mike.checkIn(one_bedroom1);
        one_bedroom1.setGuest(mike);
        mike.getRoomInfo(one_bedroom1);

    }

【问题讨论】:

  • 为什么您的房间需要访问权限?
  • 我会将 Room 存储在 HashMap 中,键是房间号,值是 Room 对象,我会设计 Room obj,如下所示:class Room { private boolean isAvailable; private Guest occupant; private double dailyPrice; private RoomType roomType; /** all getters and setters */ } 并且 Java 最佳实践也说明了使用 CamelCase 格式创建类。 (每个第一个字母单词的大写字母)如果您将可用性存储在对象本身中,则不需要从 Room 类访问 HashMap。
  • 听起来像家庭作业 ;) 我认为可用性属于 Room 类本身。如果 hashmap 的目的是模拟数据库,那么创建一个专用的类“MockRoomDatabase”或类似的东西,你有一个唯一的键(最好使用计数器,因为房间号在现实世界中可能会改变)和值你有整个 Room 对象。您还需要提供与真实数据库中相同的访问方法(例如 putOne readOne、putMany、readMany、...)
  • 还有一个建议:使用 Builder 生成 Room 对象:en.wikipedia.org/wiki/Builder_pattern#Java 构造函数中的 args 不应超过 2 个,而且真正的预订应用程序可能会有更多的房间参数.这将使以后的测试变得更加容易!
  • @asus 不要忘记默认将您的属性设为私有。在POO中,这是一个非常重要的概念,你会看到保护他的属性不被其他部分代码直接修改是非常有用的:)

标签: java oop


【解决方案1】:

为什么不让可用性成为Room 的成员?

private boolean available;

public void setAvailable(boolean available) {
  this.available = available;
}

public boolean isAvailable() {
  return this.available;
}

main:

one_bedroom1.setAvailable(false);

【讨论】:

  • 还不如使用Project Lombok通过注解生成setter/getter
  • @Phil 是的,但是在学习 Java 时,我认为学习基础知识非常有用,可以充分了解可访问性和封装的工作原理。作为一名年轻的开发人员,我很高兴为我的练习创建自己的 toString 或 equals 方法(当然还有使用超级 IDE 功能生成我的 getter 和 setter)^^
  • @Phil 我正在等待实现JEP 359。这将使 Lombok 项目这样的“解决方案”变得多余。
【解决方案2】:

您可以让Guest 引用Room,而不是checkedIn 的布尔值,或者除了布尔值之外。那你就可以mike.chekcIn(one_bedroom1)了。

您也可以让Room 引用Guest,例如属性occupant

因此,当您登记客人时,您在Guest 中设置room 属性,在Room 中设置occupant 属性。

这样,很容易知道您的房间是否有空或您的客人是否已登记入住。

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多