设计模式之状态模式

简单梳理状态模式

状态模式实现

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

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

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

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.printf("当前时间{%s}点,上午工作,精神百倍。", work.getHour());
            System.out.println();
        }else{
            work.setCurrent(new NoonState());
            work.WriteProgram();
        }
    }
}

中午

public class NoonState extends State{
    @Override
    public void WriteProgram(Work work) {
        if(work.getHour()<13){
            System.out.printf("当前时间{%s}点,饭后犯困,需要午休。", work.getHour());
            System.out.println();
        }else{
            work.setCurrent(new AfternoonState());
            work.WriteProgram();
        }
    }
}

下午

public class AfternoonState extends State{
    @Override
    public void WriteProgram(Work work) {
        if(work.getHour()<17){
            System.out.printf("当前时间{%s}点,下午状态还不错,继续。", work.getHour());
            System.out.println();
        }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.printf("当前时间{%s}点,加班哦,疲惫至极。", work.getHour());
                System.out.println();
            }else{
                work.setCurrent(new SleepingState());
                work.WriteProgram();
            }
        }
    }
}

下班

public class RestState extends State{
    @Override
    public void WriteProgram(Work work) {
        System.out.printf("当前时间{%s}点,下班回家。", work.getHour());
        System.out.println();
    }
}

睡觉

public class SleepingState extends State{
    @Override
    public void WriteProgram(Work work) {
        System.out.printf("当前时间{%s}点,不行了,要睡了。", work.getHour());
        System.out.println();
    }
}

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

定义业务方法

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

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}点,不行了,要睡了。

结果分析

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

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

https://xmlrambo.github.io/
https://xmlrambo.gitee.io/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值