设计模式之状态模式

  1. 简单梳理状态模式
    1. 状态模式实现
      1. 定义业务方法
      2. 执行结果
      3. 结果分析
  2. 联系作者
    1. 微信公众号
    2. QQ群

简单梳理状态模式

状态模式实现

现实工作中我们经常面临工作任务重需要加班的情况,
但是通常一天的工作效率与时间点有一定关系,比如饭后困效率低等。

我们就用不同的时间点,工作效率问题这个场景来简单梳理状态模式。

首先我们定义基本类,工作状态类。

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

定义工作类(包括工作状态,工作时间点,是否完成工作)

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

    public Work(){
        current = new ForenoonState();
    }

    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 void WriteProgram(){
        current.WriteProgram(this);
    }
}

针对不同的时间点,来定义几个不同的工作效率的具体类。

上午

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() +"点,不行了,要睡了。");
    }
}

这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。

定义业务方法

看在具体业务逻辑中如何使用

public class StateTest {
    public static void main(String[] args) {
        //状态模式
        func1();
    }

    public static void func1(){
        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(false);
        work.WriteProgram();

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

        work.setHour(22);
        work.WriteProgram();

    }
}

执行结果

当前时间{9.0}点,上午工作,精神百倍。
当前时间{10.0}点,上午工作,精神百倍。
当前时间{12.0}点,饭后犯困,需要午休。
当前时间{13.0}点,下午状态还不错,继续。
当前时间{14.0}点,下午状态还不错,继续。
当前时间{17.0}点,加班哦,疲惫至极。
当前时间{17.0}点,加班哦,疲惫至极。
当前时间{19.0}点,加班哦,疲惫至极。
当前时间{22.0}点,不行了,要睡了。

结果分析

状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是,当控制一个对象状态转换的条件表达式过于复杂时,
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

联系作者

微信公众号

xiaomingxiaola
(BossLiu)

QQ群

58726094


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com

×

喜欢就点赞,疼爱就打赏

日记本 网文世界