狀態(tài)模式(State)完箩,當(dāng)一個對象的內(nèi)在狀態(tài)改變時允許改變其行為飞蹂,這個對象看起來像是改變了其類柄延。代替大量if else if判斷分支條件悲雳。
PS:其實就通過子類的各種繼承來進行邏輯轉(zhuǎn)換挎峦,通過定義新的子類可以很容易地增加新的狀態(tài)和轉(zhuǎn)換。
當(dāng)一個對象的行為取決于它的狀態(tài)合瓢,并且它必須在運行時刻根據(jù)狀態(tài)改變它的行為時坦胶,就可以考慮使用狀態(tài)模式
主方法
public class main {
public static void main(String[] args) {
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.setFinish(true);
// emergencyProjects.setFinish(false);
emergencyProjects.writeProgram();
emergencyProjects.setHour(19);
emergencyProjects.writeProgram();
emergencyProjects.setHour(22);
emergencyProjects.writeProgram();
}
}
狀態(tài)抽象類
/**
* 抽象狀態(tài)類
*/
public abstract class State {
public abstract void writeProgram(Work work);
}
工作類
/**
* 工作類
*/
public class Work {
public Work() {
current = new ForenoonState();
}
private State current;
private int hour;//時間屬性,狀態(tài)轉(zhuǎn)換的依據(jù)
private boolean finish = false;//工作任務(wù)是否完成的標志位
public void writeProgram() {
current.writeProgram(this);
}
public State getCurrent() {
return current;
}
public void setCurrent(State current) {
this.current = current;
}
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;
}
}
多種狀態(tài)類
public class ForenoonState extends State {
public void writeProgram(Work work) {
if (work.getHour() < 12) {
System.out.println(String.format("當(dāng)前時間:{%d}點 上午工作晴楔,精神百倍", work.getHour()));
} else {
work.setCurrent(new NoonState());
work.writeProgram();
}
}
}
public class NoonState extends State {
public void writeProgram(Work work) {
if (work.getHour() < 13) {
System.out.println(String.format("當(dāng)前時間:{%d}點 餓了顿苇,午飯;犯困税弃,午休纪岁。", work.getHour()));
} else {
work.setCurrent(new AfternoonState());
work.writeProgram();
}
}
}
public class AfternoonState extends State {
public void writeProgram(Work work) {
if (work.getHour() < 17) {
System.out.println(String.format("當(dāng)前時間:{%d}點 下午狀態(tài)還不錯,繼續(xù)努力", work.getHour()));
} else {
work.setCurrent(new EveningState());
work.writeProgram();
}
}
}
/**
* 加個finish判斷则果,如果任務(wù)完成即下班
*/
public class EveningState extends State {
public void writeProgram(Work work) {
if (work.isFinish()) {//如果工作完成了就調(diào)用下班休息類
work.setCurrent(new RestState());
work.writeProgram();
} else {
if (work.getHour() < 21) {
System.out.println(String.format("當(dāng)前時間:{%d}點 加班哦幔翰,疲累之極", work.getHour()));
} else {
work.setCurrent(new SleepingState());//工作未完成
work.writeProgram();
}
}
}
}
public class RestState extends State {
public void writeProgram(Work work) {
System.out.println(String.format("當(dāng)前時間:{%d}點 下班回家了", work.getHour()));
}
}
public class SleepingState extends State {
public void writeProgram(Work work) {
System.out.println(String.format("當(dāng)前時間:{%d}點 不行了漩氨,睡著了", work.getHour()));
}
}