狀態模式允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了他的類。
適用場景:
一個對象的行為取決於他的狀態,並且它必須在運行時根據狀態改變它的行為;
一個操作中含有龐大的多分支結構,並且這些分支決定於對象的狀態。
類圖:
模式的組成:
環境類Context: 定義客戶感興趣的接口。維護一個ConcreteState子類的實例,這個實例定義當前狀態;
抽象狀態類State: 定義一個接口以封裝與Context的一個特定狀態相關的行為;
具體狀態類ConcreteState: 每一子類實現一個與Context的一個狀態相關的行為;
實例:push顯示紅-〉黃-〉綠,pull顯示綠-〉黃-〉紅
public interface State
{
public void handlePush(Context context);
public void handlePull(Context context);
public String getColor();
}
public class Context
{
private State state = null;
public State getState()
{
return state;
}
public void setState(final State state)
{
this.state = state;
}
public void push()
{
state.handlePush(this);
}
public void pull()
{
state.handlePull(this);
}
}
//RED
public class ConcreteStateA implements State
{
@Override
public void handlePush(final Context context)
{
System.out.print(this.getColor());
final State state = new ConcreteStateB();
context.setState(state);
state.handlePush(context);
}
@Override
public void handlePull(final Context context)
{
System.out.print(this.getColor());
}
@Override
public String getColor()
{
return "RED";
}
}
//YELLOW
public class ConcreteStateB implements State
{
@Override
public void handlePush(final Context context)
{
System.out.print(this.getColor());
final State state = new ConcreteStateC();
context.setState(state);
state.handlePush(context);
}
@Override
public void handlePull(final Context context)
{
System.out.print(this.getColor());
final State state = new ConcreteStateA();
context.setState(state);
state.handlePull(context);
}
@Override
public String getColor()
{
return "YELLOW";
}
}
//green
public class ConcreteStateC implements State
{
@Override
public void handlePush(final Context context)
{
System.out.print(this.getColor());
}
@Override
public void handlePull(final Context context)
{
System.out.print(this.getColor());
final State state = new ConcreteStateB();
context.setState(state);
state.handlePull(context);
}
@Override
public String getColor()
{
return "GREEN";
}
}
public class Client
{
public static void main(final String[] args)
{
// YTODO Auto-generated method stub
final Context context = new Context();
context.setState(new ConcreteStateA());
System.out.println("PUSH:");
context.push();
System.out.println("\nPULL:");
context.pull();
}
}
結果:
PUSH:
REDYELLOWGREEN
PULL:
GREENYELLOWRED