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);
}
}
狀態模式好處與用處:
好處:
狀態模式的好處是將與特定狀態相關的行爲局部化,並且將不同狀態的行爲分割開來。這麼做的目的說白了就是消除龐大的條件分支語句。
用在什麼地方:
當一個對象的行爲取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行爲時,就可以考慮使用狀態模式。