一.什麼是狀態模式
類的行爲是基於它的狀態改變的。這種類型的設計模式屬於行爲型模式。
二.狀態模式怎麼寫
狀態模式主要有環境角色,抽象狀態角色,具體狀態角色。且看UML類圖
看起來和那個策略模式是不是有點像
我們且看代碼
public interface WorkState {
void writeProgram(Work context);
}
public class StartState implements WorkState{
@Override
public void writeProgram(Work context) {
if(context.hour>9 &&context.hour<21) {
System.out.println("寫代碼");
}else {
context.setState(new StopState());
context.writeProgram();
}
}
}
public class StopState implements WorkState {
@Override
public void writeProgram(Work context) {
if (context.hour >= 21 || context.hour<=9) {
System.out.println("休息了");
}
}
}
public class Work {
private WorkState currentState;
public double hour;
public Work () {
currentState=new StartState();
}
public WorkState getState() {
return currentState;
}
public void setState(WorkState state) {
this.currentState = state;
}
public void writeProgram() {
currentState.writeProgram(this);
}
}
客戶端測試
public class Client {
public static void main(String[] args) {
Work work=new Work();
work.hour=9.1;
work.writeProgram();
work.hour=22;
work.writeProgram();
}
}
打印結果
寫代碼
休息了
我們再去看策略模式,在客戶端調用方面,我們在策略模式中是在客戶端new了一個對象,也就是客戶端根據不同的對象來調用不同的方法,而狀態模式則是隻是根據上下文環境對象的一個屬性來執行不同的操作。它的行爲是基於屬性改變的。
三.小結
狀態模式是解決對象的行爲依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行爲。
當代碼中包含大量與對象屬性相關的條件語句時採用狀態模式。