状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
状态模式的好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换,即消除庞大的条件分支语句。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Work emergencyProjects = new Work();
emergencyProjects.setHour(9);
emergencyProjects.writeProgram();
emergencyProjects.setHour(10);
emergencyProjects.writeProgram();
emergencyProjects.setHour(12);
emergencyProjects.writeProgram();
emergencyProjects.setHour(13);
emergencyProjects.writeProgram();
emergencyProjects.setHour(14);
emergencyProjects.writeProgram();
emergencyProjects.setHour(17);
emergencyProjects.writeProgram();
emergencyProjects.setFinish(true);
emergencyProjects.writeProgram();
emergencyProjects.setHour(19);
emergencyProjects.writeProgram();
emergencyProjects.setHour(22);
emergencyProjects.writeProgram();
}
}
abstract class State {
public abstract void writeProgram(Work w);
}
class ForenoonState extends State {
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
if (w.getHour() < 12) {
System.out.println(w.getHour());
} else {
w.setCurrent(new NoonState());
w.writeProgram();
}
}
}
class NoonState extends State {
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
if (w.getHour() < 13) {
System.out.println(w.getHour());
} else {
w.setCurrent(new AfternoonState());
w.writeProgram();
}
}
}
class AfternoonState extends State {
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
if (w.getHour() < 17) {
System.out.println(w.getHour());
} else {
w.setCurrent(new EveningState());
w.writeProgram();
}
}
}
class EveningState extends State {
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
if (w.isFinish()) {
w.setCurrent(new RestState());
} else {
if (w.getHour() < 21) {
System.out.println(w.getHour()+"extraworking");
} else {
w.setCurrent(new SleepingState());
w.writeProgram();
}
}
}
}
class SleepingState extends State {
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
System.out.println(w.getHour()+"sleep");
}
}
class RestState extends State {
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
System.out.println(w.getHour()+"go home");
}
}
class Work {
private State current;
private double hour;
private boolean finish = false;
public Work() {
current = new ForenoonState();
}
public State getCurrent() {
return current;
}
public void setCurrent(State current) {
this.current = current;
}
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() {
current.writeProgram(this);
}
}
此时的代码,如果要完成强制员工必须在20点之前离开公司,增加一个强制下班状态,并改动一下办完工作状态类的判断就可以了,这不影响其他状态代码