2011-11-13 176 views
5

我必須設計和實施酒店預訂系統。我有設計問題:預訂系統

  • 預訂的數組對象列表
  • 的房間數組對象列表

我想「儲備」的房間在一個給定的日期。

要預訂沒有日期的房間將很容易,但它的日期部分是複雜的。我正在爲這個設計而努力,並且在正確的方向上推動我能夠編碼。

How do you say房間預訂在這個日期,但不是在那個日期?

沒有數據庫或任何它只是一個抽象的預訂系統。

(我已經在這個凝望了一會兒,原諒我,如果如果該解決方案是容易的)

感謝。

+0

如果這是一門功課,請相應地標記它。 –

+0

我想你應該也會發現這個很有用:http://stackoverflow.com/questions/8008495/decoupling-mysql-data-versus-ease-of-use/8009992#8009992 – hovanessyan

回答

4

編輯 - 第二個想法,爲什麼不讓每個Room都有一個Reservation實例的列表,這些實例又有開始/結束屬性,可以告訴您何時發生預留?

這樣,爲了確定房間是否有預定時間,您只需循環房間的預訂並查看所討論的時間是否在任何預訂的開始/結束範圍內。 .granted代碼不是太容易(也不是太難)實現,但這是基本的想法。

+0

啊,這是一個絕妙的主意。我正在考慮一個新的課程或什麼的,但是一個房間,當它的保留以及像價格等其他數據一樣存儲時,這是一個好主意。 編輯:我喜歡這個網站。我不必明確地要求代碼或任何東西,並且在編寫解決方案時仍然可以對我的自我感覺良好,即我被暗示在正確的方向而不是被告知。 – Shane

+0

@shane,酷 - 請注意,搜索開放式預訂可能會非常棘手,因此您需要搜索潛在的每個房間以找到空缺點。 – hvgotcodes

1

想一想,房間是一個資源,你可以儲備給定的時間範圍。你也有幾個房間可以獨立保留。你將如何實現以下方法:

class Room { 
    boolean isAvailable(Date date) {/*...*/} 
    Date nextAvailableDate() {/*...*/} 
} 

提示:房間有了解其保留

從您的問題中不清楚預訂的目的是什麼。它只包含日期範圍還是分配給特定房間?如果是前者,您可能會遇到尋找新預訂的免費空間的問題 - 這可以通過循環遍歷所有房間並使用上述方法輕鬆實現。

如果後者:由於預訂知道房間,房間也可能知道預訂。因此,通過迭代預留來實現上述方法是微不足道的。

4

創建三個類(HotelRoom & 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; 
    } 
} 
+0

我很欣賞Saurav,但這個問題差不多5年(從我的學生時代開始),所以我不再需要幫助,因爲我現在已經畢業了:) – Shane