状态模式

2020-03-18 15:13:51 浏览数 (1)

当代码中存在太多判断分支时,我们可能需要使用状态模式来优化。优化模式解决的问题是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的问题逻辑简化。 概念比较抽象,下面的代码,定义了State抽象状态类,内部使用了Context类,子类实现时在handle中定义与不同状态下的行为。

代码语言:javascript复制
/**
 * 定义一个抽象状态类,封装与Context的一个特定状态相关的行为
 */
public abstract class State {
    public abstract void Handle(Context context);
}
代码语言:javascript复制
/**
 * ConcreteState 具体状态,实现与Context状态的一个相关的行为
 */
public class ConcreteStateA extends State {

    @Override
    public void Handle(Context context) {
        System.out.println("Play is in start state");
        context.setState(this);
    }

    public String toString(){
        return "Start State";
    }
}
代码语言:javascript复制
/**
 * ConcreteState 具体状态,实现与Context状态的一个相关的行为
 */
public class ConcreteStateB extends State {
    @Override
    public void Handle(Context context) {
        System.out.println("Play is in stop state");
        context.setState(this);
    }

    public String toString(){
        return "Stop State";
    }
}
代码语言:javascript复制
/**
 * Context 是一个带有某个状态的类
 */
public class Context {

    private State state;

    public Context(State state){
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) { // 定义Context的状态
        this.state = state;
        System.out.println("当前状态: "   state);
    }

    public void request(){ // 对请求做处理,并设置下一状态
        state.Handle(this);
    }
}
代码语言:javascript复制
public class Main { // 使用 Context 来查看当状态 State 改变时的行为变化。

    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());
        context.request();
        Context context1 = new Context(new ConcreteStateB());
        context1.request();
    }
}

0 人点赞