状态模式

来源:互联网 发布:网络人头像 编辑:程序博客网 时间:2024/06/02 17:56

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
解决的问题:主要解决的是当控制一个对象的转换表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一些列类中,可以把复杂的逻辑判断简单化。
模式的角色:
- 上下文环境(Context)
- 抽象状态(State)
- 具体状态(Concrete State)

Work.java

public 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 boolean taskFinished(){        return finish;    }    //将State的实现类传入,执行不同状态下的writeProgram()方法    public void setState(State s){        this.current=s;    }    public void writeProgram(){        current.WriteProgram(this);    }}

State.java-状态类

public 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.taskFinished()){            w.setState(new RestState());            w.writeProgram();        }else{            if(w.getHour()<21){                System.out.println("当前时间,"+w.getHour()+"点,加班疲劳至极...");            }else{                w.setState(new SleepingState());                w.writeProgram();            }        }    }}class RestState extends State{    @Override    public void WriteProgram(Work w) {        System.out.println("当前时间:"+w.getHour()+"点,下班回家休息了");    }}class SleepingState extends State{    @Override    public void WriteProgram(Work w) {        System.out.println("当前时间:"+w.getHour()+"点,眼睛睁不开,睡着了");    }}

Test.java

public class Test {    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.setFinish(true);        work.setFinish(false);        work.writeProgram();        work.setHour(19);        work.writeProgram();        work.setHour(22);        work.writeProgram();    }}

输出

0 0