状态模式,最常用的模式之一,也是最不好落地的模式 —— 遇到状态调整几乎重写所有代码。

先看代码

状态模式抽象类

/**
 * 状态模式 - 抽象类
 * @version 0.1
 * @author  BaiJing.biz
 */
public abstract class StateElevator {
    // 声明环境角色
    protected Context context;

    public void setContext(Context context) {
        this.context = context;
    }

    public abstract void open();
    public abstract void close();
    public abstract void run();
    public abstract void stop();

}

环境类


/**
 * 状态模式 - 环境类
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Context {

    // 和状态对象对应的常量
    public final static Open OPEN_STATE = new Open();
    public final static Run RUN_STATE = new Run();
    public final static Stop STOP_STATE = new Stop();
    public final static Close CLOSE_STATE = new Close();

    // 当前「状态」变量
    private StateElevator stateElevator;

    public StateElevator getStateElevator() {
        return stateElevator;
    }

    public void setStateElevator(StateElevator stateElevator) {
        this.stateElevator = stateElevator;
        // 设置 Context
        this.stateElevator.setContext(this);
    }

    public void open(){
        this.stateElevator.open();
    }

    public void close(){
        this.stateElevator.close();
    }

    public void run(){
        this.stateElevator.run();
    }

    public void stop(){
        this.stateElevator.stop();
    }

}

状态类的实例


/**
 * 状态模式 - 抽象类 : 开启状态类
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Open extends StateElevator {

    @Override
    public void open() {
        System.out.println("OPEN 电梯开启.");
    }

    @Override
    public void close() {
        super.context.setStateElevator(Context.CLOSE_STATE);

        super.context.close();
    }

    @Override
    public void run() {
        // 开启,无法运行;无动作
    }

    @Override
    public void stop() {
        // 开门状态,本身就是停止的;无动作
    }
}

/**
 * 状态模式 - 抽象类 : 运行状态类
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Run extends StateElevator {

    @Override
    public void open() {
        // 无动作
    }

    @Override
    public void close() {
        // 无动作
    }

    @Override
    public void run() {
        System.out.println("RUN 电梯运行中。 run()");
    }

    @Override
    public void stop() {
        super.context.setStateElevator(Context.STOP_STATE);

        super.context.getStateElevator().stop();
    }
}



/**
 * 状态模式 - 抽象类 : 停止状态类
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Stop extends StateElevator {

    @Override
    public void open() {
        super.context.setStateElevator(Context.OPEN_STATE);

        super.context.getStateElevator().open();
    }

    @Override
    public void close() {
        super.context.setStateElevator(Context.CLOSE_STATE);

        super.context.getStateElevator().close();
    }

    @Override
    public void run() {
        super.context.setStateElevator(Context.RUN_STATE);
        
        super.context.getStateElevator().run();
    }

    @Override
    public void stop() {
        System.out.println("STOP 电梯停止中。 stop()");
    }
}

super.context.getStateElevator().run();       // 其它主体操作

super.context.close();          // 主动操作

/**
 * 状态模式 - 抽象类 : 关闭状态类
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Close extends StateElevator {

    @Override
    public void open() {
        super.context.setStateElevator(Context.OPEN_STATE);
        super.context.open();
    }

    @Override
    public void close() {
        System.out.println("CLOSE 电梯门关闭。 close()");
    }

    @Override
    public void run() {
        super.context.setStateElevator(Context.RUN_STATE);
        super.context.run();
    }

    @Override
    public void stop() {
        super.context.setStateElevator(Context.STOP_STATE);
        super.context.stop();
    }
}

客户

public class CustomerRun {
    public static void main(String[] args) {

        Context context = new Context();

        context.setStateElevator(new Open());

        context.run();
        context.open();
        context.close();
        context.stop();

    }
}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐