概念
狀態模式 = 策略模式 + ‘狀態’。
類的行爲基於它的狀態改變而改變。
例子
package mytest.stateDemo;
public class Context {
//持有一個State類型的對象實例
private State state;
public Context(State state){
this.state = state;
}
public void setState(State state) {
this.state = state;
}
//這裏調用狀態的方法
public void handle() {
//轉調state來處理
this.state.handle(this);
}
}
package mytest.stateDemo;
public interface State {
//狀態對應的處理
public void handle(Context context);
}
package mytest.stateDemo;
//具體狀態類A
public class ConcreteStateA implements State{
@Override
public void handle(Context context) {
System.out.println("現在是在狀態A");
//這裏是重點,在策略模式中沒有這個步驟,這裏就是區別於策略模式的地方,重新設置了State的狀態,也就是改變了狀態
context.setState(new ConcreteStateB());
}
}
package mytest.stateDemo;
//具體狀態類B
public class ConcreteStateB implements State{
@Override
public void handle(Context
context) {
System.out.println("現在是在狀態B");
context.setState(new ConcreteStateA());
}
}
package mytest.stateDemo;
public class Client {
public static void main(String[] args) {
//創建狀態
State state = new ConcreteStateA();
//創建環境
Context context = new Context(state);
context.handle();
context.handle();
context.handle();
context.handle();
context.handle();
}
}
輸出結果:
現在是在狀態A
現在是在狀態B
現在是在狀態A
現在是在狀態B
現在是在狀態A