状态模式

状态模式指当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。我们实现一个复杂的状态机工作流时就可以使用状态模式解决。如果不用状态模式,一个方法将包含大量状态判断,十分难以维护。

状态模式示例

下面我们实现一个状态模式代码。

State.java

public abstract class State {
    public abstract void handle(Context context);
}

StateA.java

public class StateA extends State {
    @Override
    public void handle(Context context) {
        context.setState(new StateB());
    }
}

StateB.java

public class StateB extends State {
    @Override
    public void handle(Context context) {
        context.setState(new StateA());
    }
}

Context.java

public class Context {
    private State state;

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

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        state.handle(this);
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Context context = new Context(new StateA());
        showState(context.getState());

        context.request();
        showState(context.getState());

        context.request();
        showState(context.getState());
    }

    private static void showState(Object o) {
        System.out.println(o.getClass().getName());
    }
}

上述代码,描述了两个状态A和B,用户每次调用request()状态就切换一次。

首先思考,如果使用状态判断怎样实现这个状态机?肯定要维护一组状态常量了,然后每次状态转换时,都判断当前状态是哪个状态常量,然后根据状态机逻辑进行跳转。这是传统面向过程的写法。使用了状态模式后,值得注意的是,上面代码中的状态机并没有大量使用状态判断,而是使用状态类的handle()Context类巧妙的解决了这个问题。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap