狀態模式是一種行為設計模式,它允許對象在內部狀態改變時改變它的行為。它基于對象的內部狀態而改變其行為,看起來好像修改了對象的類。
狀態模式的關鍵組件有三個:上下文(Context)、狀態(State)和具體狀態(Concrete State)。
下面是一個例子來說明狀態模式的應用:
// 抽象狀態類
interface State {void handle(Context context);
}// 具體狀態類1
class ConcreteState1 implements State {public void handle(Context context) {System.out.println("當前狀態是狀態1");context.setState(new ConcreteState2()); // 設置下一個狀態}
}// 具體狀態類2
class ConcreteState2 implements State {public void handle(Context context) {System.out.println("當前狀態是狀態2");context.setState(new ConcreteState1()); // 設置下一個狀態}
}// 上下文類
class Context {private State state;public Context(State state) {this.state = state;}public void setState(State state) {this.state = state;}public void request() {state.handle(this);}
}// 客戶端代碼
public class Main {public static void main(String[] args) {// 創建初始狀態State initialState = new ConcreteState1();Context context = new Context(initialState);// 發起請求context.request(); // 打印"當前狀態是狀態1"context.request(); // 打印"當前狀態是狀態2"context.request(); // 打印"當前狀態是狀態1"}
}
在上述示例中,狀態模式被用于管理上下文(Context)對象的不同狀態。每個具體狀態(Concrete State)都實現了狀態(State)接口,并根據需要進行狀態轉換。上下文類(Context)通過委托給當前狀態對象來處理請求,并可以在運行時更改狀態。
通過狀態模式,客戶端代碼可以與上下文對象進行交互,而不需要直接處理復雜的狀態邏輯。這對于需要根據狀態改變行為的場景非常有用,例如自動售貨機中的不同狀態(待機、售貨、缺貨等)的管理。