状态模式(State)

时间:2021-6-3 作者:qvyue

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。代替大量if else if判断分支条件。
PS:其实就通过子类的各种继承来进行逻辑转换,通过定义新的子类可以很容易地增加新的状态和转换。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式

主方法

public class main {
    public static void main(String[] args) {
        Work emergencyProjects = new Work();
        emergencyProjects.setHour(9);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(10);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(12);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(13);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(14);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(17);

        emergencyProjects.setFinish(true);
//        emergencyProjects.setFinish(false);

        emergencyProjects.writeProgram();
        emergencyProjects.setHour(19);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.writeProgram();
    }
}

状态抽象类

/**
 * 抽象状态类
 */
public abstract class State {
    public abstract void writeProgram(Work work);
}

工作类

/**
 * 工作类
 */
public class Work {
    public Work() {
        current = new ForenoonState();
    }

    private State current;
    private int hour;//时间属性,状态转换的依据
    private boolean finish = false;//工作任务是否完成的标志位

    public void writeProgram() {
        current.writeProgram(this);
    }

    public State getCurrent() {
        return current;
    }

    public void setCurrent(State current) {
        this.current = current;
    }

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }

    public boolean isFinish() {
        return finish;
    }

    public void setFinish(boolean finish) {
        this.finish = finish;
    }
}

多种状态类

public class ForenoonState extends State {
    public void writeProgram(Work work) {
        if (work.getHour() 
public class NoonState extends State {
    public void writeProgram(Work work) {
        if (work.getHour() 
public class AfternoonState extends State {
    public void writeProgram(Work work) {
        if (work.getHour() 
/**
 * 加个finish判断,如果任务完成即下班
 */
public class EveningState extends State {
    public void writeProgram(Work work) {
        if (work.isFinish()) {//如果工作完成了就调用下班休息类
            work.setCurrent(new RestState());
            work.writeProgram();
        } else {
            if (work.getHour() 
public class RestState extends State {
    public void writeProgram(Work work) {
        System.out.println(String.format("当前时间:{%d}点 下班回家了", work.getHour()));
    }
}
public class SleepingState extends State {
    public void writeProgram(Work work) {
        System.out.println(String.format("当前时间:{%d}点 不行了,睡着了", work.getHour()));
    }
}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。