状态模式:
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.只要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化.
/** * @author stefanie zhao * @date 2014-8-19 下午02:48:51 */public abstract class State { public abstract void writeProgram(Work w);}
/** * @author stefanie zhao * @date 2014-8-19 下午02:49:30 */public class Work { private State current; public Work() { current = new ForenoonState(); } private double hour; private boolean finish = false; /** * @return the current */ public State getCurrent() { return current; } /** * @param current * the current to set */ public void setCurrent(State current) { this.current = current; } /** * @return the hour */ public double getHour() { return hour; } /** * @param hour * the hour to set */ public void setHour(double hour) { this.hour = hour; } /** * @return the finish */ public boolean isFinish() { return finish; } /** * @param finish * the finish to set */ public void setFinish(boolean finish) { this.finish = finish; } public void writeProgram() { current.writeProgram(this); }}
/** * @author stefanie zhao * @date 2014-8-19 下午02:57:16 */public class NoonState extends State { /* * (non-Javadoc) * * @see us.echo.pattern.state.State#writeProgram(us.echo.pattern.state.Work) */ @Override public void writeProgram(Work w) { if (w.getHour() < 13) System.out.format("当前时间:%s 点 饿了,午饭:犯困,午休", w.getHour()); else { w.setCurrent(new AfternoonState()); w.writeProgram(); } }}
/** * @author stefanie zhao * @date 2014-8-19 下午02:54:36 */public class ForenoonState extends State { @Override public void writeProgram(Work w) { if (w.getHour() < 12) System.out.format("当前时间:%s 点 上午工作,净胜百倍", w.getHour()); else { w.setCurrent(new NoonState()); w.writeProgram(); } }}
/** * @author stefanie zhao * @date 2014-8-19 下午02:58:11 */public class AfternoonState extends State { /* * (non-Javadoc) * * @see us.echo.pattern.state.State#writeProgram(us.echo.pattern.state.Work) */ @Override public void writeProgram(Work w) { System.out.format("当前时间:%s 点 下午状态不错,继续努力", w.getHour()); }}
public class Main { public static void main(String[] args) { Work p = new Work(); p.setHour(9); p.writeProgram(); p.setHour(13); p.writeProgram(); p.setHour(15); p.writeProgram(); }}