我必須設計和實施酒店預訂系統。我有設計問題:預訂系統
- 預訂的數組對象列表
- 的房間數組對象列表
我想「儲備」的房間在一個給定的日期。
要預訂沒有日期的房間將很容易,但它的日期部分是複雜的。我正在爲這個設計而努力,並且在正確的方向上推動我能夠編碼。
How do you say房間預訂在這個日期,但不是在那個日期?
沒有數據庫或任何它只是一個抽象的預訂系統。
(我已經在這個凝望了一會兒,原諒我,如果如果該解決方案是容易的)
感謝。
我必須設計和實施酒店預訂系統。我有設計問題:預訂系統
我想「儲備」的房間在一個給定的日期。
要預訂沒有日期的房間將很容易,但它的日期部分是複雜的。我正在爲這個設計而努力,並且在正確的方向上推動我能夠編碼。
How do you say房間預訂在這個日期,但不是在那個日期?
沒有數據庫或任何它只是一個抽象的預訂系統。
(我已經在這個凝望了一會兒,原諒我,如果如果該解決方案是容易的)
感謝。
編輯 - 第二個想法,爲什麼不讓每個Room
都有一個Reservation
實例的列表,這些實例又有開始/結束屬性,可以告訴您何時發生預留?
這樣,爲了確定房間是否有預定時間,您只需循環房間的預訂並查看所討論的時間是否在任何預訂的開始/結束範圍內。 .granted代碼不是太容易(也不是太難)實現,但這是基本的想法。
啊,這是一個絕妙的主意。我正在考慮一個新的課程或什麼的,但是一個房間,當它的保留以及像價格等其他數據一樣存儲時,這是一個好主意。 編輯:我喜歡這個網站。我不必明確地要求代碼或任何東西,並且在編寫解決方案時仍然可以對我的自我感覺良好,即我被暗示在正確的方向而不是被告知。 – Shane
@shane,酷 - 請注意,搜索開放式預訂可能會非常棘手,因此您需要搜索潛在的每個房間以找到空缺點。 – hvgotcodes
想一想,房間是一個資源,你可以儲備給定的時間範圍。你也有幾個房間可以獨立保留。你將如何實現以下方法:
class Room {
boolean isAvailable(Date date) {/*...*/}
Date nextAvailableDate() {/*...*/}
}
提示:房間有了解其保留。
從您的問題中不清楚預訂的目的是什麼。它只包含日期範圍還是分配給特定房間?如果是前者,您可能會遇到尋找新預訂的免費空間的問題 - 這可以通過循環遍歷所有房間並使用上述方法輕鬆實現。
如果後者:由於預訂知道房間,房間也可能知道預訂。因此,通過迭代預留來實現上述方法是微不足道的。
創建三個類(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;
}
}
我很欣賞Saurav,但這個問題差不多5年(從我的學生時代開始),所以我不再需要幫助,因爲我現在已經畢業了:) – Shane
如果這是一門功課,請相應地標記它。 –
我想你應該也會發現這個很有用:http://stackoverflow.com/questions/8008495/decoupling-mysql-data-versus-ease-of-use/8009992#8009992 – hovanessyan