设计问题:预约系统

Sha*_*ane 9 java

我必须为酒店设计和实施预订系统.我有

  • Reservation对象的数组列表
  • 房间对象的数组列表

我想在指定日期"保留"房间.

预订一个没有约会的房间会很容易,但它的日期部分会让它变得复杂.我正在努力设计这个并且自信地朝着正确的方向轻推我可以编码它.

How do you say一个房间在这个日期被预订但在该日期没有?

没有数据库或任何东西它只是一个抽象的预订系统.

(我一直盯着这一段时间,请原谅我,如果解决方案很容易)

谢谢.

Sau*_*ahu 8

创建三个类(Hotel,Room&Reservation):

  • Reservation对象在这里像发票一样使用,并预订流程保持分离.

  • 每个Room对象(专用于酒店中的每个房间号)包含一个map存储reservedDates为关键和reservationObject值的对象.

  • Hotel作曲rooms.对于每个预订请求,Hotel循环遍历room列表,然后room通过它自己遍历map以查找是否可以在要求的日期进行预订.

请注意,预订功能将日期作为列表,而不仅仅是两个日期(作为startDate和endDate).这与前者可以从后者得到的相同.

示例代码如下:

class Hotel {
    private String name, address;
    private List<Room> roomList;   //key : roomNumber
    public Hotel(){
        roomList = new ArrayList<Room>();
    }
    public Reservation bookRoomForDates(List<Integer> dateList, Guest guest){
        for(Room room : roomList){
            Reservation reservation = room.bookForGivenDates(dateList, guest);
            if(reserved != null) return reservation; //Reservation successFull!
        }
        return null; //Reservation failed!
    }
}
class Reservation {
    private String id;
    private Date inDate, outDate;
    private Guest guest;

    public Reservation(Room room, int startDate, int endDate, Guest guest){
        //populate the member variables.
    }
}

class Room {
    private String id;
    private int roomNumber, floorNum;
    private Map<Integer, Reservation> reservedDates;  // key : date as Integer (YYYYMMDD)

    public Room(int roomNumber){
        reservedDates = new HashMap<Integer, Reservation>();
        this.roomNumber = roomNumber;
    }

    //A guest request for booking on dates(in YYYYMMDD format) in the dateList
    public Reservation bookForGivenDates(List<Integer> dateList, Guest guest)  
    {   
        if(dateList.isEmpty()) return null;

        for(Integer date : dateList){
            Reservation res = reservedDates.get(date);  
            if(res != null) {  // We don't store null value for unreserved dates for the room.
                return null;  // Room is reserved on this date by another guest. So, this room is unavailable.
            }
        }
        //this room is unreserved on all requested dates. So go on and reserve this room for asked dates
        int startDate = dateList.get(0);
        int endDate   = dateList.get(dateList.size() - 1);

        Reservation newReservation = new Reservation(this, startDate, endDate, guest);
        for(Integer date : dateList){
            reservedDates.put(date, newReservation);
        }
        return newReservation;
    }
}
Run Code Online (Sandbox Code Playgroud)


hvg*_*des 6

编辑 - 第二个想法,为什么不让每个Room都有一个Reservation实例列表,而这些实例又有开始/结束属性,告诉你何时发生预订?

这样,为了判断一个房间是否有预定的时间,你只需通过预订房间,看看有问题的时间是否在任何预订的开始/结束范围内......授予该代码实施并不太容易(也不太难),但这是基本的想法.