什么是状态模式
对象中的状态变更引起其状态相关的行为发生变更。将状态进行封装,使状态的变更在具体状态类中进行传递,从而控制各个状态下的行为。
为什么要用状态模式
当一个对象中有很多状态,且各个状态引起不同的行为切换时,可避免繁乱的分支判断,即可以用状态模式,将行为封装,并通过状态模式中的环境角色封装状态切换。
状态模式组成
状态行为接口
public interface StateOpt{
/**
* 行为1
*/
void opt1();
/**
* 行为2
*/
void opt2();
}
抽象状态类
public abstract class AbstractState implements StateOpt{
/**
* 定义一个环境橘色,用户状态之间的变更传递
*/
protected Context context;
public void setContext(Context context) {
this.context = context;
}
}
具体状态角色
public class ConcreteAbstractState1 extends AbstractState {
@Override
public void opt1() {
System.out.println("state 1 opt");
}
@Override
public void opt2() {
super.context.setCurrentState(super.context.STATE2);
super.context.opt2();
}
}
public class ConcreteAbstractState2 extends AbstractState {
@Override
public void opt1() {
super.context.setCurrentState(super.context.STATE1);
super.context.opt1();
}
@Override
public void opt2() {
System.out.println("state 2 opt");
}
}
上下文环境角色
public class Context implements StateOpt{
public final AbstractState STATE1 = new ConcreteAbstractState1();
public final AbstractState STATE2 = new ConcreteAbstractState2();
private AbstractState currentState;
public AbstractState getCurrentState() {
return currentState;
}
public void setCurrentState(AbstractState currentState) {
//切换状态
this.currentState = currentState;
//传递环境角色
this.currentState.setContext(this);
}
@Override
public void opt1(){
//委托当前状态对象处理
this.currentState.opt1();
}
@Override
public void opt2(){
this.currentState.opt2();
}
}
测试驱动
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setCurrentState(context.STATE1);
context.opt1();
context.opt2();
}
}