菜鸟成长记(七)——状态模式

每天工作状态程序:
public class Program {
    public static void main(String[] args) {
        // 紧急项目
        Work emergencyProjets = new Work();
        emergencyProjets.setHour(9);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(10);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(12);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(13);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(14);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(17);
        emergencyProjets.writeProgram();


        emergencyProjets.setFinish(false);
        emergencyProjets.writeProgram();


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

class Work {
    private int hour;

    public int getHour() {
        return hour;
    }

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

    private boolean finish = false;

    public boolean isFinish() {
        return finish;
    }

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

    public void writeProgram() {
        if (hour < 12) {
            System.out.println("当前时间:" + hour + "点 上午工作,精神百倍");
        }
        else if (hour < 13) {
            System.out.println("当前时间:" + hour + "点 饿了,午饭;犯困,午休。");
        }
        else if (hour < 17) {
            System.out.println("当前时间:" + hour + "点 下午状态不错,继续努力。");
        }
        else{
            if (finish) {
                System.out.println("当前时间:" + hour + "点 下班回家。");
            } else {
                if (hour < 21) {
                    System.out.println("当前时间:" + hour + "点 加班哦,疲累之极。");
                } else {
                    System.out.println("当前时间:" + hour + "点 不行了,睡着了。");
                }
            }
        }
    }
}
采用状态模式改进之后:
public class Program {
    public static void main(String[] args) {
        // 紧急项目
        Work emergencyProjets = new Work();
        emergencyProjets.setHour(9);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(10);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(12);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(13);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(14);
        emergencyProjets.writeProgram();
        emergencyProjets.setHour(17);
        emergencyProjets.writeProgram();

        emergencyProjets.setFinish(false);
        emergencyProjets.writeProgram();

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

abstract class State {
    public abstract void writeProgram(Work w);
}

//上午工作状态
class ForenoonState extends State {

    @Override
    public void writeProgram(Work w) {
        if (w.getHour() < 12) {
            System.out.println("当前时间:" + w.getHour() + "点 上午工作,精神百倍");
        } else {
            w.setState(new NoonState());
            w.writeProgram();
        }
    }
}

// 中午工作状态
class NoonState extends State {

    @Override
    public void writeProgram(Work w) {
        if (w.getHour() < 13) {
            System.out.println("当前时间:" + w.getHour() + "点 饿了,午饭;犯困,午休。");
        } else {
            w.setState(new AfternoonState());
            w.writeProgram();
        }
    }
}

// 下午工作状态
class AfternoonState extends State {

    @Override
    public void writeProgram(Work w) {
        if (w.getHour() < 17) {
            System.out.println("当前时间:" + w.getHour() + "点 下午状态不错,继续努力。");
        } else {
            w.setState(new EveningState());
            w.writeProgram();
        }
    }
}

// 晚间工作状态
class EveningState extends State {

    @Override
    public void writeProgram(Work w) {
        if (w.isFinish()) {
            w.setState(new RestState());
            w.writeProgram();
        } else {
            if (w.getHour() < 21) {
                System.out.println("当前时间:" + w.getHour() + "点 加班哦,疲累之极。");
            } else {
                w.setState(new SleepingState());
                w.writeProgram();
            }
        }
    }
}

// 睡眠状态
class SleepingState extends State {

    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间:" + w.getHour() + "点 不行了,睡着了。");
    }
}

// 下班休息状态
class RestState extends State {

    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间:" + w.getHour() + "点 下班回家。");
    }
}

class Work {
    private State current;
    public Work() {
        current = new ForenoonState();
    }

    private double hour;

    public double getHour() {
        return hour;
    }

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

    private boolean finish = false;

    public boolean isFinish() {
        return finish;
    }

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

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

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


状态模式好处与用处:
好处:
状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。这么做的目的说白了就是消除庞大的条件分支语句。
用在什么地方:
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值