状态设计模式(酒店入住示例)
0. UML结构图
![状态模式UML结构图](https://i-blog.csdnimg.cn/blog_migrate/9df2ed73dff74346630dca244dbe062c.png)
1. 酒店入住示例 Code
1.1 房间状态接口
public interface State {
boolean free();
boolean book();
boolean check();
}
1.2 房间空闲状态
public class FreeState implements State {
@Override
public boolean free() {
return true;
}
@Override
public boolean book() {
return true;
}
@Override
public boolean check() {
return false;
}
@Override
public String toString() {
return "FreeState{ 空闲 }";
}
}
1.3 房间已预定状态
public class BookedState implements State {
@Override
public boolean free() {
return false;
}
@Override
public boolean book() {
return false;
}
@Override
public boolean check() {
return true;
}
@Override
public String toString() {
return "BookedState{ 已被预订 }";
}
}
1.4 房间已入住状态
public class CheckedState implements State {
@Override
public boolean free() {
return false;
}
@Override
public boolean book() {
return false;
}
@Override
public boolean check() {
return false;
}
@Override
public String toString() {
return "CheckedState{ 已被入住 }";
}
}
1.5 房间上下文 - 状态处理
public class HomeContext {
private static final FreeState freeState = new FreeState();
private static final BookedState bookedState = new BookedState();
private static final CheckedState checkedState = new CheckedState();
private State state;
public HomeContext() {
this.state = new FreeState();
}
public State getState() {
return state;
}
public void free() {
if (state.free()) {
state = freeState;
System.out.println("HomeContext.free: 房间已被清空!");
} else {
System.out.println("HomeContext.free: 房间清空失败!");
}
printState();
}
public void book() {
if (state.book()) {
state = bookedState;
System.out.println("HomeContext.book: 房间预订成功!");
} else {
System.out.println("HomeContext.book: 房间预订失败!");
}
printState();
}
public void check() {
if (state.check()) {
state = checkedState;
System.out.println("HomeContext.check: 入住房间成功!");
} else {
System.out.println("HomeContext.check: 入住房间失败!");
}
printState();
}
private void printState() {
System.out.println(">>>>>>> 当前房间状态: " + state);
}
}
2. 酒店入住示例 Test
public class StateTest {
public static void main(String[] args) {
HomeContext context = new HomeContext();
System.out.println(context.getState());
context.book();
context.book();
context.check();
context.check();
context.book();
}
}