状态模式,通过状态变更促使行为的变化。
// 环境类
public class Context {
// 两种状态会互相切换
public static final State STATE1 = new ConcreteState1();
public static final State STATE2 = new ConcreteState2();
// 当前的状态
private State currentState;
// 获取当前的状态
public State getCurrentState() {
return currentState;
}
// 设置当前的状态和环境对象
public void setCurrentState(State currentState) {
this.currentState = currentState;
this.currentState.setContext(this);
}
// 行为方法1,委托给状态对象去做
public void handle1(){
this.currentState.doSomething1();
}
// 行为方法2,委托给状态对象去做
public void handle2(){
this.currentState.doSomething2();
}
}
// 抽象状态
public abstract class State {
// 环境角色
protected Context context;
// 设置环境角色
public void setContext(Context context){
this.context = context;
}
// 行为方法
public abstract void doSomething1();
public abstract void doSomething2();
}
// 具体状态对象,处理状态1的情况,状态2的情况交给环境类处理
public class ConcreteState1 extends State {
@Override
public void doSomething1() {
// 本状态自己处理的业务逻辑
}
@Override
public void doSomething2() {
// 设置当前状态为2,交给context来处理
super.context.setCurrentState(Context.STATE2);
super.context.handle2();
}
}
// 具体状态对象,处理状态2的情况,状态1的情况交给环境类处理
public class ConcreteState2 extends State {
@Override
public void doSomething1() {
// 设置当前状态为1,交给context来处理
super.context.setCurrentState(Context.STATE1);
super.context.handle1();
}
@Override
public void doSomething2() {
// 本状态自己处理的业务逻辑
}
}
// 测试类
public class Test {
public static void main(String[] args) {
// 环境类
Context context = new Context();
// 设置当前状态为state1状态
context.setCurrentState(new ConcreteState1());
// 执行对应的方法是伴随着状态的切换的,状态的切换被隐藏了
context.handle1();
context.handle2();
}
}
行为随状态改变而改变的场景,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。
在程序中大量使用 switch 语句或者 if 判断语句会导致程序结构不清晰, 逻辑混乱, 使用状态模式可以很好地避免这一问题, 它通过扩展子类实现了条件的判断处理。