大话设计模式-状态模式的实践-不同的工作状态

版权声明:Leo.All Rights Reserved. https://blog.csdn.net/qq_41113081/article/details/89468209

在这里插入图片描述

状态的总接口

public abstract class State {
    public abstract void WriteProgram(Work work);
}

具体的六个状态 代表了上班的一天

/**
 * 上午工作状态
 */
public class ForenoonState extends State {
    @Override
    public void WriteProgram(Work work) {
        if (work.getHour() < 12) {
            System.out.println("当前时间: " + work.getHour() + " 上午工作 精神百倍");
        } else {
            work.setCurrent(new NoonState());
            work.WriteProgram();
        }
    }
}

/**
 * 中午工作状态
 */
public class NoonState extends State {
    @Override
    public void WriteProgram(Work work) {
        if (work.getHour() < 13) {
            System.out.println("当前时间: " + work.getHour() + " 中午了 饿了 午饭 犯困 午休");
        } else {
            work.setCurrent(new AfternoonState());
            work.WriteProgram();
        }
    }
}

/**
 * 下午工作状态
 */
public class AfternoonState extends State {
    @Override
    public void WriteProgram(Work work) {
        if (work.getHour() < 17) {
            System.out.println("当前时间: " + work.getHour() + " 下午工作 状态还不错 继续努力");
        } else {
            work.setCurrent(new EveningState());
            work.WriteProgram();
        }
    }
}

/**
 * 晚上工作状态
 */
public class EveningState extends State {
    @Override
    public void WriteProgram(Work work) {
        if (work.isFinish()) {
            work.setCurrent(new RestState());
            work.WriteProgram();
        } else {
            if (work.getHour() < 21) {
                System.out.println("当前时间: " + work.getHour() + " 唉 加班哦 ");
            } else {
                work.setCurrent(new SleepingState());
                work.WriteProgram();
            }
        }
    }
}

/**
 * 下班休息状态
 */
public class RestState extends State {
    @Override
    public void WriteProgram(Work work) {
        System.out.println("当前时间: " + work.getHour() + " 下班回家了");
    }
}

/**
 * 睡眠状态
 */
public class SleepingState extends State {
    @Override
    public void WriteProgram(Work work) {
        System.out.println("当前时间: " + work.getHour() + " 不行了 睡着了");
    }
}

工作类 其实就是Context上下文对象 用来管理不同的状态 对外提供接口

public class Work {
    private State current;
    private double hour;
    private boolean finish = false;

    public Work() {
        //工作初始化为上午状态 即上午九点开始上班
        this.current = new ForenoonState();
    }


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


    public State getCurrent() {
        return current;
    }

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

    public double getHour() {
        return hour;
    }

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

    public boolean isFinish() {
        return finish;
    }

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

测试类

public class Main {
    public static void main(String[] args) {
        Work work = new Work();
        work.setHour(9);
        work.WriteProgram();

        work.setHour(10);
        work.WriteProgram();

        work.setHour(12);
        work.WriteProgram();

        work.setHour(13);
        work.WriteProgram();

        work.setHour(14);
        work.WriteProgram();

        work.setHour(17);
        work.WriteProgram();

        //work.setFinish(true);

        work.setHour(19);
        work.WriteProgram();

        work.setHour(17);
        work.WriteProgram();

    }
}

控制台输出

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41113081/article/details/89468209
今日推荐