《大话设计模式》第十六章
package ch16;
public class Work {
private int hour;
private State state;
private boolean finish = false;
public Work() {
state = new ForenoonState();
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void writeProgram() {
state.writeProgram(this);
}
}
package ch16;
public abstract class State {
public abstract void writeProgram(Work work);
}
package ch16;
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();
}
}
}
package ch16;
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();
}
}
}
package ch16;
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();
}
}
}
package ch16;
public class EveningState extends State {
@Override
public void writeProgram(Work work) {
if (work.isFinish()) {
work.setState(new RestState());
work.writeProgram();
} else {
if (work.getHour() < 21) {
System.out.println("当前时间:" + work.getHour() + ",晚上");
} else {
work.setState(new SleepingState());
work.writeProgram();
}
}
}
}
package ch16;
public class SleepingState extends State {
@Override
public void writeProgram(Work work) {
System.out.println("当前时间:" + work.getHour() + ",睡觉");
}
}
package ch16;
public class RestState extends State {
@Override
public void writeProgram(Work work) {
System.out.println("当前时间:" + work.getHour() + ",休息");
}
}
package ch16;
/**
* 状态模式
* @author Administrator
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Work work = new Work();
work.setHour(9);
work.writeProgram();
work.setHour(10);
work.writeProgram();
work.setHour(11);
work.writeProgram();
work.setHour(12);
work.writeProgram();
work.setHour(13);
work.writeProgram();
work.setHour(14);
work.writeProgram();
work.setHour(17);
work.writeProgram();
// work.setFinish(true);
work.setHour(19);
work.writeProgram();
work.setHour(22);
work.writeProgram();
}
}
运行:
当前时间:9,上午
当前时间:10,上午
当前时间:11,上午
当前时间:12,中午
当前时间:13,下午
当前时间:14,下午
当前时间:17,晚上
当前时间:19,晚上
当前时间:22,睡觉
该模式可以用在状态机里。