每天工作状态程序:
状态模式好处与用处:
好处:
状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。这么做的目的说白了就是消除庞大的条件分支语句。
用在什么地方:
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。
public class Program {
public static void main(String[] args) {
// 紧急项目
Work emergencyProjets = new Work();
emergencyProjets.setHour(9);
emergencyProjets.writeProgram();
emergencyProjets.setHour(10);
emergencyProjets.writeProgram();
emergencyProjets.setHour(12);
emergencyProjets.writeProgram();
emergencyProjets.setHour(13);
emergencyProjets.writeProgram();
emergencyProjets.setHour(14);
emergencyProjets.writeProgram();
emergencyProjets.setHour(17);
emergencyProjets.writeProgram();
emergencyProjets.setFinish(false);
emergencyProjets.writeProgram();
emergencyProjets.setHour(19);
emergencyProjets.writeProgram();
emergencyProjets.setHour(22);
emergencyProjets.writeProgram();
}
}
class Work {
private int hour;
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
private boolean finish = false;
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public void writeProgram() {
if (hour < 12) {
System.out.println("当前时间:" + hour + "点 上午工作,精神百倍");
}
else if (hour < 13) {
System.out.println("当前时间:" + hour + "点 饿了,午饭;犯困,午休。");
}
else if (hour < 17) {
System.out.println("当前时间:" + hour + "点 下午状态不错,继续努力。");
}
else{
if (finish) {
System.out.println("当前时间:" + hour + "点 下班回家。");
} else {
if (hour < 21) {
System.out.println("当前时间:" + hour + "点 加班哦,疲累之极。");
} else {
System.out.println("当前时间:" + hour + "点 不行了,睡着了。");
}
}
}
}
}
采用状态模式改进之后:
public class Program {
public static void main(String[] args) {
// 紧急项目
Work emergencyProjets = new Work();
emergencyProjets.setHour(9);
emergencyProjets.writeProgram();
emergencyProjets.setHour(10);
emergencyProjets.writeProgram();
emergencyProjets.setHour(12);
emergencyProjets.writeProgram();
emergencyProjets.setHour(13);
emergencyProjets.writeProgram();
emergencyProjets.setHour(14);
emergencyProjets.writeProgram();
emergencyProjets.setHour(17);
emergencyProjets.writeProgram();
emergencyProjets.setFinish(false);
emergencyProjets.writeProgram();
emergencyProjets.setHour(19);
emergencyProjets.writeProgram();
emergencyProjets.setHour(22);
emergencyProjets.writeProgram();
}
}
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.isFinish()) {
w.setState(new RestState());
w.writeProgram();
} else {
if (w.getHour() < 21) {
System.out.println("当前时间:" + w.getHour() + "点 加班哦,疲累之极。");
} else {
w.setState(new SleepingState());
w.writeProgram();
}
}
}
}
// 睡眠状态
class SleepingState extends State {
@Override
public void writeProgram(Work w) {
System.out.println("当前时间:" + w.getHour() + "点 不行了,睡着了。");
}
}
// 下班休息状态
class RestState extends State {
@Override
public void writeProgram(Work w) {
System.out.println("当前时间:" + w.getHour() + "点 下班回家。");
}
}
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 void setState(State current) {
this.current = current;
}
public void writeProgram() {
current.writeProgram(this);
}
}
状态模式好处与用处:
好处:
状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。这么做的目的说白了就是消除庞大的条件分支语句。
用在什么地方:
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。