狀態模式(State)

狀態模式的定義與特點

狀態(State)模式的定義:對有狀態的對象,把複雜的“判斷邏輯”提取到不同的狀態對象中,允許狀態對象在其內部狀態發生改變時改變其行爲。

狀態模式是一種對象行爲型模式,其主要優點如下。

  1. 狀態模式將與特定狀態相關的行爲局部化到一個狀態中,並且將不同狀態的行爲分割開來,滿足“單一職責原則”。
  2. 減少對象間的相互依賴。將不同的狀態引入獨立的對象中會使得狀態轉換變得更加明確,且減少對象間的相互依賴。
  3. 有利於程序的擴展。通過定義新的子類很容易地增加新的狀態和轉換。


狀態模式的主要缺點如下。

  1. 狀態模式的使用必然會增加系統的類與對象的個數。
  2. 狀態模式的結構與實現都較爲複雜,如果使用不當會導致程序結構和代碼的混亂。

狀態模式的結構與實現

狀態模式把受環境改變的對象行爲包裝在不同的狀態對象裏,其意圖是讓一個對象在其內部狀態改變的時候,其行爲也隨之改變。現在我們來分析其基本結構和實現方法。

1. 模式的結構

狀態模式包含以下主要角色。

  1. 環境(Context)角色:也稱爲上下文,它定義了客戶感興趣的接口,維護一個當前狀態,並將與狀態相關的操作委託給當前狀態對象來處理。
  2. 抽象狀態(State)角色:定義一個接口,用以封裝環境對象中的特定狀態所對應的行爲。
  3. 具體狀態(Concrete    State)角色:實現抽象狀態所對應的行爲。


其結構圖

2. 模式的實現

代碼

package test.state;

public class StatePatternClient
{
    public static void main(String[] args)
    {
        Context context=new Context();    //創建環境
        context.Handle();    //處理請求
        context.Handle();
        context.Handle();
        context.Handle();
    }
}
//環境類
class Context
{
    private State state;
    //定義環境類的初始狀態
    public Context()
    {
        this.state=new ConcreteStateA();
    }
    //設置新狀態
    public void setState(State state)
    {
        this.state=state;
    }
    //讀取狀態
    public State getState()
    {
        return(state);
    }
    //對請求做處理
    public void Handle()
    {
        state.Handle(this);
    }
}
//抽象狀態類
abstract class State
{
    public abstract void Handle(Context context);
}
//具體狀態A類
class ConcreteStateA extends State
{
    public void Handle(Context context)
    {
        System.out.println("當前狀態是 A.");
        context.setState(new ConcreteStateB());
    }
}
//具體狀態B類
class ConcreteStateB extends State
{
    public void Handle(Context context)
    {
        System.out.println("當前狀態是 B.");
        context.setState(new ConcreteStateA());
    }
}

結果

狀態模式的應用場景

通常在以下情況下可以考慮使用狀態模式。

  • 當一個對象的行爲取決於它的狀態,並且它必須在運行時根據狀態改變它的行爲時,就可以考慮使用狀態模式。
  • 一個操作中含有龐大的分支結構,並且這些分支決定於對象的狀態時。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章