狀態模式把對象的行爲包裝在不同的狀態對象裏,每一個狀態對象都有一個共同的抽象狀態類。
1、定義
當一個對象的內在狀態改變時允許改變其行爲,這個對象看起來是改變了其類。
2、使用場景
- 一個對象的行爲取決於它的狀態,並且它必須在運行時根據狀態改變它的行爲。
- 代碼中包含大量與對象狀態有關的條件語句。
3、UML圖
狀態模式和策略模式的結構基本是一樣的。但它們的目的、本質卻完全不一樣。
狀態模式的行爲是平行的、不可替換的。
策略模式的行爲是彼此獨立的、可相互替換的。
4、示例代碼
public interface State {
/**
* 狀態對應的處理
*/
public void handle(String sampleParameter);
}
public class ConcreteStateA implements State {
@Override
public void handle(String sampleParameter) {
System.out.println("ConcreteStateA handle :" + sampleParameter);
}
}
public class ConcreteStateB implements State {
@Override
public void handle(String sampleParameter) {
System.out.println("ConcreteStateB handle :" + sampleParameter);
}
}
public class Context {
// 持有一個State類型的對象實例
private State state;
public void setState(State state) {
this.state = state;
}
/**
* 用戶感興趣的接口方法
*/
public void request(String param) {
// 轉調state來處理
state.handle(param);
}
}
客戶端調用:
public class Client {
public static void main(String[] args) {
// 創建狀態
State state = new ConcreteStateA();
Context context = new Context();
context.setState(state);
// 請求
context.request("test");
}
}
上下文和狀態處理對象
- 在狀態模式中,上下文是持有狀態的對象,但上下文並不處理跟狀態相關的行爲,而是把處理狀態的功能委託給了狀態對應的狀態處理類來處理。
- 在具體的狀態處理類中,經常需要獲取上下文自身的數據,甚至在必要的時候回回調上下文的方法,所以,通常將上下文自身當做參數傳遞給具體的狀態處理類。