一、定义
当一个对象内部状态改变时,允许改变其行为,这个对象看起来是改变了其类。本例子中,根据时间的变化,工作状态在不断地改变。如果现在增加一个工作完成,提前下班的规定只需要增加实现类即可。
二、代码实例
-
需求
根据不同时间,描述不同的工作状态。代码要求扩展性强,符合设计原则。
-
代码实现
工作类:
public class Work { private State state; private double hour; private boolean finish = false; public Work() { this.state = new ForenoonState(); } public State getState() { return state; } public void setState(State state) { this.state = state; } public double getHour() { return hour; } public void setHour(double hour) { this.hour = hour; } public boolean isFinish() { return finish; } public void setFinish(boolean finish) { this.finish = finish; } public void writeProgram() { this.state.writeProgram(this); } }
状态接口类(重点):
public abstract class State { public abstract void writeProgram(Work work); }
各种时间段的实现类:
public class ForenoonState extends State { @Override public void writeProgram(Work work) { if (work.getHour() < 12) { System.out.println("上午工作,精神百倍。当前时间:" + work.getHour()); } else { work.setState(new NoonState()); work.writeProgram(); } } }
public class NoonState extends State { @Override public void writeProgram(Work work) { if (work.getHour() < 13) { System.out.println("中午,午饭,午休。当前时间:" + work.getHour()); } else { work.setState(new AfternoonState()); work.writeProgram(); } } }
public class AfternoonState extends State { @Override public void writeProgram(Work work) { if (work.getHour() < 17) { System.out.println("下午状态不错,继续努力。当前时间:" + work.getHour()); } else { work.setState(new EveningState()); work.writeProgram(); } } }
public class EveningState extends State { @Override public void writeProgram(Work work) { if (work.isFinish()) { work.setState(new RestState()); work.writeProgram(); } if (work.getHour() < 21) { System.out.println("加班,疲累至极。当前时间:" + work.getHour()); } else { work.setState(new SleepingState()); } } }
public class RestState extends State { @Override public void writeProgram(Work work) { System.out.println("下班回家了。当前时间:" + work.getHour()); } }
public class SleepingState extends State { @Override public void writeProgram(Work work) { System.out.println("不行了,睡觉。当前时间:" + work.getHour()); } }
如果你的代码中有大量的if else分支,可以考虑使用这种模式。也许这种模式在实际开发中很少用到,但是不妨我们学习这种模式的思想。