狀態模式
<設計模式其實很簡單>筆記
當一個對象的內在狀態改變時允許改變其行爲,這個對象看起來像是改變了其類。
//抽象的狀態類
public abstract calss State{
public String stateName;
public abstract void Handle(Context context);
}
//具體狀態A
public class ConcreteStateA extends State{
public ConcreteStateA(){
stateName = "狀態A";
}
//覆蓋父類的抽象方法
@Override
public void Handle(Context context){
context.setState(new ConcreteStateB());
}
}
//具體狀態B
public class ConcreteStateB extends State{
public ConcreteStateB(){
stateName = "狀態B";
}
//覆蓋父類的抽象方法
@Override
public void Handle(Context context){
context.setState(new ConcreteStateA());
}
}
//Context類
public class Context{
private State state;
public Context(State state){
this.state = state;
}
//設置狀態
public void setState(State state){
System.out.println("當前狀態爲:" + this.state.state.Name);
this.state = state;
System.out.println("當前變更爲:" + this.state.state.Name);
}
public void Request(){
state.Handle(this);
}
}
//客戶端
public static void main(String[] args){
Context context = new Context(new ConcreteStateA());
context.Request();
context.Request();
context.Request();
}
③好處:
將與特定狀態相關的行爲進行局部化,並且將不同狀態的行爲進行分割。也就是將特定的與狀態相關的行爲都放進一個對象中,由於所有與狀態有關的代碼都存在於某個具體的狀態類中,所以通過定義新的具體狀態類就可以很容易地增加新的狀態和轉換。
④適用的情況:
當一個對象的行爲取決於它的狀態並且它必須在運行時刻根據狀態來改變自己的行爲時
當一個操作中含有大量的多分支的條件語句,並且這些分支都依賴於該對象的狀態時