简介
状态模式能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。
抽象状态角色
public interface State {
public void open(Context context);
public void action(Context context);
public void close(Context context);
}
定义状态角色在特定状态下的相关行为。
具体状态角色
public class OpenState implements State {
@Override
public void open(Context context) {
System.out.println("open状态下不能重复执行open操作");
}
@Override
public void action(Context context) {
context.setState(new ActionState());
System.out.println("执行action操作");
}
@Override
public void close(Context context) {
context.setState(new CloseState());
System.out.println("执行close操作");
}
}
public class ActionState implements State {
@Override
public void open(Context context) {
System.out.println("action状态下不能执行open操作");
}
@Override
public void action(Context context) {
System.out.println("action状态下不能重复执行action操作");
}
@Override
public void close(Context context) {
context.setState(new CloseState());
System.out.println("执行close操作");
}
}
public class CloseState implements State {
@Override
public void open(Context context) {
context.setState(new OpenState());
System.out.println("执行open操作");
}
@Override
public void action(Context context) {
System.out.println("close状态不能执行action操作");
}
@Override
public void close(Context context) {
System.out.println("close状态不能重复执行close操作");
}
}
每一个具体的状态角色类对应一个具体的状态,不同的状态角色类中的行为也不相同。
环境角色
public class Context {
private State state = null;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public Context(){
// 默认close状态
state = new CloseState();
}
public void open(){
state.open(this);
}
public void action(){
state.action(this);
}
public void close(){
state.close(this);
}
}
使用环境角色类来封装状态角色,并通过该类来调用不同状态下的各个行为方法。
测试
public class StateDemo {
@Test
public void stateTest(){
Context context = new Context();
context.open();
context.action();
context.close();
}
}
总结
状态模式很好的解决了if else
之类的代码,但是当状态的数量增加时,也会导致具体状态角色的类的数量随之增加。