菜鳥成長記(七)——狀態模式

每天工作狀態程序:
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);
    }
}


狀態模式好處與用處:
好處:
狀態模式的好處是將與特定狀態相關的行爲局部化,並且將不同狀態的行爲分割開來。這麼做的目的說白了就是消除龐大的條件分支語句。
用在什麼地方:
當一個對象的行爲取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行爲時,就可以考慮使用狀態模式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章