酒店房間管理系統需求
有家酒店一共有5層,每層有10個房間,其中:
1,2層是标準間
3,4層是雙人間
5層是豪華間
根據以前所學習的知識實作一個酒店房間管理系統,需要提供房間狀态檢視,房間預定、退房的功能。
在編寫該系統之前先來學習一個新知識,如何擷取使用者的輸入?
import java.util.Scanner;
public class GetInput {
public static void main(String[] args){
Scanner s = new Scanner(System.in);
//程式執行到此處,會暫停來等待使用者的輸入.
String userInput = s.next();
System.out.println("您輸入了:" + userInput);
}
}
需求分析
先來抽象,既然要做酒店房間管理系統,那麼就會跟酒店和房間打交道,是以将這兩個對象使用Java語言表現出來:
首先需要定義一個Room類,裡面存儲房間編号,房間類型,是否空房
其次需要定義一個Hotel類,裡面存儲所有房間的基本資訊。裡面提供預定、退房、檢視房間狀态的方法。
最後需要定義一個Test類,用來接收使用者的輸入,進而提供房間服務。
編碼實作
定義一個Room類
//酒店的房間
public class Room {
//房間編号
private String id;
//房間類型 标準間 雙人間 豪華間
private String type;
//房間是否被占用 false表示空閑,true表示占用
private boolean isUse;
//無參構造方法
public Room() {}
//有參構造方法,用來初始化該類中的屬性值
public Room(String id, String type, boolean isUse) {
this.id = id;
this.type = type;
this.isUse = isUse;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isUse() {
return isUse;
}
public void setUse(boolean isUse) {
this.isUse = isUse;
}
//重寫toString方法,直接将房間的基本資訊拼接成字元串傳回
public String toString(){
return "["+id+","+type+","+(isUse?"占用":"空閑")+"]";
}
}
定義一個Hotel類
public class Hotel{
/*
酒店裡面是一個挨着一個房間,需要将這些房間展現出來,
酒店中的房間個數是固定的,在Java中數組的長度是固定的,這裡可以使用數組來存儲這些房間對象。
酒店有多層,是以使用二維數組
定義房間類型的數組,該數組中用來存儲房間對象
*/
private Room[][] rooms;
//無參構造方法,用來初始化房間對象資料
Hotel() {}
//酒店的房間是共有5層,每層10個房間
rooms = new Room[5][10];
//指派,初始化房間号
//1,2 标準間:101,102 ... 110,201,202 ... 210
//3 4 雙人間
//5 豪華間
for(int i=0;i<rooms.length;i++){
for(int j=0;j<rooms[i].length;j++){
if(i==0 || i==1){
rooms[i][j] = new Room(((i+1)*100)+j+1+"","标準間",false);
}
if(i==2 || i==3){
rooms[i][j] = new Room(((i+1)*100)+j+1+"","雙人間",false);
}
if(i==4){
rooms[i][j] = new Room(((i+1)*100)+j+1+"","豪華間",false);
}
}
}
}
//在使用酒店管理系統時需要檢視每個房間的狀态,是否已被占用
//對外提供一個列印酒店房間清單的方法
public void print(){
for(int i=0;i<rooms.length;i++){
for(int j=0;j<rooms[i].length;j++){
System.out.print(rooms[i][j] + " ");
}
System.out.println();
}
}
//當使用者預訂時,需要将房間狀态改為占用
//對外提供一個預訂酒店的方法
public void order(String id){
for(int i=0;i<rooms.length;i++){
for(int j=0;j<rooms[i].length;j++){
//根據傳入的房間編号去數組中查找與之對應的房間
if(rooms[i][j].getId().equals(id)){
//将該房間的狀态改成占用
rooms[i][j].setUse(true);
//此時後面就沒有必要再繼續循環了,是以直接return
return;
}
}
}
}
//對外提供一個退房酒店的方法
public void checkOut(String id){
for(int i=0;i<rooms.length;i++){
for(int j=0;j<rooms[i].length;j++){
//根據傳入的房間編号去數組中查找與之對應的房間
if(rooms[i][j].getId().equals(id)){
//将該房間的狀态改成空閑
rooms[i][j].setUse(false);
//此時後面就沒有必要再繼續循環了,是以直接return
return;
}
}
}
}
}
定義一個測試類
import java.util.Scanner;
public class Test{
public static void main(String[] rags){
Scanner s = new Scanner(System.in);
System.out.println("歡迎使用酒店管理系統,酒店房間清單如下所示:");
//初始化酒店
Hotel h = new Hotel();
//輸出房間清單
h.print();
while(true){
System.out.print("請輸入預定或者退房");
String order = s.next();
if("預定".equals(order)){
System.out.print("請輸入預訂房間的編号:");
String id = s.next();
//預訂房間
h.order(id);
}else if("退房".equals(order)){
System.out.print("請輸入退房房間的編号:");
String id = s.next();
h.checkOut(id);
}else {
System.out.print("請輸入預定或者退房");
}
//列印酒店清單
h.print();
}
}
}
代碼重構
通過上面的代碼就可以完成需求了,但是上面的代碼寫的不夠漂亮,還有一些地方需要改進,下面就來重構一下。
上面代碼中預訂和退房的方法中,代碼邏輯差不多,為了便于維護,可以将之前的兩個方法合并為一個方法。
/**
* 預訂或退房
* @param id 房間編号
* @param isIn 是否預訂 預訂:true,退房:false
*/
public void inOrOut(String id, boolean isIn){
for(int i=0;i<rooms.length;i++){
for(int j=0;j<rooms[i].length;j++){
//根據傳入的房間編号去數組中查找與之對應的房間
if(rooms[i][j].getId().equals(id)){
//修改房間狀态
rooms[i][j].setUse(isIn);
//此時後面就沒有必要再繼續循環了,是以直接return
return;
}
}
}
}
再來分析:上面的inOrOut方法中需要嵌套兩層for循環,如果資料量較大時可能會影響計算效率,雖然該酒店管理系統不會有大資料量,一般100個房間就算大型酒店了,但是這裡還是給出不使用for循環周遊的解決辦法:
/**
* 預訂或退房
* @param id 房間編号
* @param isIn 是否預訂 預訂:true,退房:false
*/
public void inOrOut(String id, boolean isIn){
try {
//将傳入的字元串類型的id轉換為int類型
int idInt = Integer.parseInt(id);
//擷取樓層
int floor = idInt / 100;
//具體的房間号
int roomId = idInt % 100;
rooms[--floor][--roomId].setUse(isIn);
} catch (NumberFormatException e) {
//當使用者輸入一個非正确數字時會捕獲這個異常
System.out.println(id + "不是一個數字,請輸入正确的數字!");
} catch (ArrayIndexOutOfBoundsException e) {
//當使用者輸入的房間編号資訊有誤時,捕獲這個異常
System.out.println("您輸入的房間号碼" + id + "有誤,請輸入正确的房間編号");
}
}