创建三个类(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)
编辑 - 第二个想法,为什么不让每个Room
都有一个Reservation
实例列表,而这些实例又有开始/结束属性,告诉你何时发生预订?
这样,为了判断一个房间是否有预定的时间,你只需通过预订房间,看看有问题的时间是否在任何预订的开始/结束范围内......授予该代码实施并不太容易(也不太难),但这是基本的想法.
归档时间: |
|
查看次数: |
11246 次 |
最近记录: |