Java設計模式九:狀態模式(State)


狀態模式允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了他的類。

適用場景:
一個對象的行為取決於他的狀態,並且它必須在運行時根據狀態改變它的行為;
一個操作中含有龐大的多分支結構,並且這些分支決定於對象的狀態。

類圖:



模式的組成:
環境類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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM