当你第一眼看到这个系统的时候你就看出来了这是一个状态图,每一个框框都表明了房间的状态,箭头表示房间状态的转换。分析以下:房间有三个状态:空闲、已预订、已入住,状态与状态之间能够根据客户的动做来进行转换。定义每一个状态的值。设计模式
状态接口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(); } }
输出结果对象
您已经成功预订了...
入住成功...
该房间处于入住状态,再也不接受预约!
退房成功...