状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 解决的问题:主要解决的是当控制一个对象的转换表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一些列类中,可以把复杂的逻辑判断简单化。 模式的角色: - 上下文环境(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(); }}输出
新闻热点
疑难解答