概述:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
角色:
Context 定义客户感兴趣的接口。 维护一个ConcreteState子类的实例,这个实例定义当前状态State 定义一个接口以封装与Context的一个特定状态相关的行为ConcreteStatesubclasses 每一子类实现一个与Context的一个状态相关的行为 类图:实现: 状态接口:
interface State { //订房 public void bookRoom(); //入住 public void checkInRoom(); //退房 public void checkOutRoom(); }状态的三个实现
/** * 空闲状态 * 能预定 */ public class FreeTimeState implements State { Room room; public FreeTimeState(Room room){ this.room = room; } @Override public void bookRoom() { System.out.println("现在是空闲状态,我预定了"); room.setState(room.getBookedDState()); } @Override public void checkInRoom() { } @Override public void checkOutRoom() { } } /** * 预定状态 * 能入住 */ public class BookedState implements State { Room room; public BookedState(Room room){ this.room = room; } @Override public void bookRoom() { } @Override public void checkInRoom() { System.out.println("现在是预定状态,我入住了"); room.setState(room.getCheckInState()); } @Override public void checkOutRoom() { } } /** * 入住状态 * 能退房 */ public class CheckInState implements State { Room room; public CheckInState(Room room){ this.room = room; } @Override public void bookRoom() { } @Override public void checkInRoom() { } @Override public void checkOutRoom() { System.out.println("现在是入住昨状态,我退房了"); room.setState(room.getFreeTimeState()); } }房间:
ublic class Room { State freeTimeState; State bookedDState; State checkInState; State state; public Room(){ freeTimeState = new FreeTimeState(this); bookedDState = new BookedState(this); checkInState = new CheckInState(this); state = freeTimeState; } /** * 预定 */ public void bookRoom() { state.bookRoom(); } /** * 入住 */ public void checkInRoom() { state.checkInRoom(); } /** * 退房 */ public void checkOutRoom() { state.checkOutRoom(); } public State getState() { return state; } public void setState(State state) { this.state = state; } public State getFreeTimeState() { return freeTimeState; } public void setFreeTimeState(State freeTimeState) { this.freeTimeState = freeTimeState; } public State getBookedDState() { return bookedDState; } public void setBookedDState(State bookedDState) { this.bookedDState = bookedDState; } public State getCheckInState() { return checkInState; } public void setCheckInState(State checkInState) { this.checkInState = checkInState; } }测试:
public class testState { public static void main(String[] args) { Room room = new Room(); room.bookRoom(); //预订 room.checkInRoom(); //入住 room.checkOutRoom(); //预订 } }打印: 现在是空闲状态,我预定了 现在是预定状态,我入住了 现在是入住昨状态,我退房了