状态模式(State)_java实现

//20210122
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现状态模式

状态模式核心思想:

  • 符合迪米特原则,将大量分支语句变成类的形式

程序源代码:

  • 此处实现一个电梯的状态转换
//电梯状态抽象类
public abstract class LiftState {

    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();
}
//电梯门关闭状态
public class ClosingState extends LiftState {
    @Override
    public void open() {
        //电梯门关了可以再开
        super.context.setLiftState(Context.OPENING_STATE);
        super.context.getLiftState().open();

    }

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

    @Override
    public void run() {
        //关门可以运行
        super.context.setLiftState(Context.RUNNING_STATE);
        super.context.getLiftState().run();
    }

    @Override
    public void stop() {
        //关门但是没有按楼层
        super.context.setLiftState(Context.STOPPING_STATE);
        super.context.getLiftState().stop();
    }
}

//电梯门开启状态
public class OpeningState extends LiftState {
    @Override
    public void open() {
        System.out.println("电梯门开启");
    }

    @Override
    public void close() {
        super.context.setLiftState(Context.CLOSING_STATE);
        super.context.getLiftState().close();
    }

    //门开着不能运行
    @Override
    public void run() {
        //什么都不做
        System.out.println("开门状态不能运行");
    }

    //门开着已经停止了
    @Override
    public void stop() {
        //什么都不做
        System.out.println("电梯处于停止状态");
    }
}

//电梯运行状态
public class RunningState extends LiftState {
    @Override
    public void open() {
        //运行途中不可开门,故什么都不做
        System.out.println("运行途中不能开门");

    }

    @Override
    public void close() {
        //门已经是关着的
        System.out.println("门处于关闭状态,无法再关门");
    }

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

    @Override
    public void stop() {
        //运行过程中可以停下
        super.context.setLiftState(Context.STOPPING_STATE);
        super.context.getLiftState().stop();
    }
}

//电梯停止状态
public class StoppingState extends LiftState {
    @Override
    public void open() {
        //停下可以开门
        super.context.setLiftState(Context.OPENING_STATE);
        super.context.getLiftState().open();

    }

    @Override
    public void close() {
        //开门状态转为关门状态
        super.context.setLiftState(Context.CLOSING_STATE);
        super.context.getLiftState().close();
    }

    @Override
    public void run() {
        //停止状态的电梯可以运行
        super.context.setLiftState(Context.RUNNING_STATE);
        super.context.getLiftState().run();
    }

    @Override
    public void stop() {
        //运行过程中可以停下
        System.out.println("电梯已停止");

    }
}

//测试主类

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

        //定义初始状态为关门(共四种初始值)
        context.setLiftState(new RunningState());
        context.open();
        context.close();
        context.run();
        context.stop();
        context.run();
        context.stop();
        context.open();
        context.close();
    }
}
  • 输出如下:

以上
希望对大家有所帮助

原文地址:https://www.cnblogs.com/lavender-pansy/p/14312399.html