使用场景
状态模式,英文名State Pattern
该模式根据对象状态来决定对象行为,由State来决定行为,而不是Context自身
这种设计模式的目的在于,将与状态切换相关的工作,交给State自己处理,Context只关心自身的其它业务
根据业务复杂程度,该模式可以有简单和复杂两种实现方式
- 简单模式下,每个状态之间是独立的,每个State对象直接处理当前状态下的工作即可,不需要考虑旧状态
- 复杂模式下,多个状态之间是有关联的,从旧状态切换到新状态,需要做一些额外的切换工作,并且不同状态之间的切换工作可能是完全不同的
代码实现 - 简单模式
abstract public class State {
public static final State STATE_A = new StateA();
public static final State STATE_B = new StateB();
Context context;
abstract public void work();
}
public class StateA extends State {
@Override
public void work() {
System.out.print("Apply State A and Work as Role A");
}
}
public class StateB extends State {
@Override
public void work() {
System.out.print("Apply State B and Work as Role B");
}
}
public class Context {
State currentState;
public void applyStateAndWork(State state) {
currentState = state;
currentState.context = this;
currentState.work();
}
}
public class APP {
public static void main(String... args) {
Context ctx = new Context();
ctx.applyStateAndWork(State.STATE_A);
ctx.applyStateAndWork(State.STATE_B);
}
}
代码实现 - 复杂模式
abstract public class State {
public static final State STATE_A = new StateA();
public static final State STATE_B = new StateB();
Context context;
public void setContext(Context context) {
this.context = context;
}
abstract public void workAsRoleA();
abstract public void workAsRoleB();
}
public class StateA extends State {
@Override
public void workAsRoleA() {
System.out.print("Apply State A and Work as Role A");
}
@Override
public void workAsRoleB() {
context.currentState = State.STATE_B;
context.workAsRoleB();
}
}
public class StateB extends State {
@Override
public void workAsRoleA() {
context.currentState = State.STATE_A;
context.workAsRoleA();
}
@Override
public void workAsRoleB() {
System.out.print("Apply State B and Work as Role B");
}
}
public class Context {
State currentState = State.STATE_A;
public void workAsRoleA() {
currentState.setContext(this);
currentState.workAsRoleA();
}
public void workAsRoleB() {
currentState.setContext(this);
currentState.workAsRoleB();
}
}
public class APP {
public static void main(String... args) {
Context ctx = new Context();
ctx.workAsRoleA();
ctx.workAsRoleB();
ctx.workAsRoleA();
}
}