當你第一眼看到這個系統的時候你就看出來了這是一個狀態圖,每一個框框都表明了房間的狀態,箭頭表示房間狀態的轉換。分析以下:房間有三個狀態:空閒、已預訂、已入住,狀態與狀態之間能夠根據客戶的動做來進行轉換。定義每一個狀態的值。設計模式
狀態接口ide
package state; /** * * Title: State * Description: 狀態接口 * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月16日 */ public interface State { /** * * <p>Title: bookRoom</p> * <p>Description: 預約房間</p> */ void bookRoom(); /** * * <p>Title: unsubscribeRoom</p> * <p>Description: 退訂房間</p> */ void unsubscribeRoom(); /** * * <p>Title: checkInRoom</p> * <p>Description: 入住</p> */ void checkInRoom(); /** * * <p>Title: checkOutRoom</p> * <p>Description: 退房</p> */ void checkOutRoom(); }
房間測試
package state; /** * * Title: Room Description: 房間 * * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月16日 */ public class Room { /* * @desc 空閒狀態 */ State freeState; /* * @desc 預訂狀態 */ State bookedState; /* * @desc 入住狀態 */ State checkInState; State state; public Room() { this.freeState = new FreeState(this); this.bookedState = new BookedState(this); this.checkInState = new CheckInState(this); // 初始狀態爲空閒狀態 this.state = freeState; } /** * * <p> * Title: bookRoom * </p> * <p> * Description: 預訂房間 * </p> */ public void bookRoom() { state.bookRoom(); } /** * * <p> * Title: unsubsribeRoom * </p> * <p> * Description: 退訂房間 * </p> */ public void unsubsribeRoom() { state.unsubscribeRoom(); } /** * * <p> * Title: checkInRoom * </p> * <p> * Description: 入住 * </p> */ public void checkInRoom() { state.checkInRoom(); } /** * * <p> * Title: checkOutRoom * </p> * <p> * Description: 退房 * </p> */ public void checkOutRoom() { state.checkOutRoom(); } /* * getter setter */ public State getFreeState() { return freeState; } public void setFreeState(State freeState) { this.freeState = freeState; } public State getBookedState() { return bookedState; } public void setBookedState(State bookedState) { this.bookedState = bookedState; } public State getCheckInState() { return checkInState; } public void setCheckInState(State checkInState) { this.checkInState = checkInState; } public State getState() { return state; } public void setState(State state) { this.state = state; } @Override public String toString() { return "該房間的狀態是:" + getState().getClass().getName(); } }
空閒狀態this
package state; /** * * Title: FreeState Description: 空閒狀態 (可預約和入住) * * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月16日 */ public class FreeState implements State { Room hotelManager; public FreeState(Room hotelManager) { this.hotelManager = hotelManager; } @Override public void bookRoom() { System.out.println("您已經成功預訂了..."); // 房間狀態切換爲已預約狀態 hotelManager.setState(hotelManager.getBookedState()); } @Override public void unsubscribeRoom() { System.out.println("該房間空閒狀態,不接受退訂!"); } @Override public void checkInRoom() { System.out.println("您已經入住..."); // 房間狀態切換爲已入住狀態 hotelManager.setState(hotelManager.getCheckInState()); } @Override public void checkOutRoom() { System.out.println("該房間空閒狀態,不接受退房!"); } }
入住狀態spa
package state; /** * * Title: CheckInState Description: 入住狀態 (只能退房) * * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月16日 */ public class CheckInState implements State { Room hotelManager; public CheckInState(Room hotelManager) { this.hotelManager = hotelManager; } @Override public void bookRoom() { System.out.println("該房間處於入住狀態,再也不接受預約!"); } @Override public void unsubscribeRoom() { System.out.println("該房間處於入住狀態,不能退訂!"); } @Override public void checkInRoom() { System.out.println("該房間處於入住狀態,不能在入住!"); } @Override public void checkOutRoom() { System.out.println("退房成功..."); // 房間狀態切換爲空閒狀態 hotelManager.setState(hotelManager.getFreeState()); } }
預訂狀態設計
package state; /** * * Title: BookedState Description: 預約狀態(可退訂 入住) * * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月16日 */ public class BookedState implements State { Room hotelManager; public BookedState(Room hotelManager) { this.hotelManager = hotelManager; } @Override public void bookRoom() { System.out.println("該房間已經處於預約狀態,不在接受預約!"); } @Override public void unsubscribeRoom() { System.out.println("退訂成功,歡迎下次光臨"); // 房間狀態切換爲空閒狀態 hotelManager.setState(hotelManager.getFreeState()); } @Override public void checkInRoom() { System.out.println("入住成功..."); // 房間狀態切換爲入住狀態 hotelManager.setState(hotelManager.getCheckInState()); } @Override public void checkOutRoom() { System.out.println("該房間處於預約狀態,不接受退房!"); } }
客戶端測試code
package state; import org.junit.Test; public class RoomTest { @Test public void test() { Room[] room = new Room[2]; for (int i = 0; i < room.length; i++) { room[i] = new Room(); } room[0].bookRoom(); room[0].checkInRoom(); room[0].bookRoom(); room[0].checkOutRoom(); } }
輸出結果對象
您已經成功預訂了...
入住成功...
該房間處於入住狀態,再也不接受預約!
退房成功...