狀態模式(State Pattern)

意圖

允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它所屬的類。

動機

在軟件開發過程中,應用程序中的有些對象可能會根據不同的情況做出不同的行爲,我們把這種對象稱爲有狀態的對象,而把影響對象行爲的一個或多個動態變化的屬性稱爲狀態。當有狀態的對象與外部事件產生互動時,其內部狀態會發生改變,從而使得其行爲也隨之發生改變。

適用性

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

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

結構

狀態模式模式的主要角色有:

  • 抽象狀態類(Status)、具體狀態類(ConcreteStatus)、環境類(Context

實現

// 抽象狀態類
public interface Status {
	void handle();
}

//具體狀態類A
public class ConcreteStratusA implements Status {

	@Override
	public void handle() {
		 System.out.println("執行 ConcreteStratusA 的處理狀態方法。。。");
	}
}

public class ConcreteStratusB implements Status {

	@Override
	public void handle() {
		 System.out.println("執行 ConcreteStratusB 的處理狀態方法。。。");
	}
}

// 環境類
public class Context {

	private Status status;

	public void setStatus(Status status) {
		this.status = status;
	}

	// 通過 set 不同的 status 對象,而動態地改變他的行爲
	public void operation() {
		status.handle();
	}

}

// 測試客戶端
public class TestClient {

	public static void main(String[] args) {
		Context context = new Context();
		Status concreteA = new ConcreteStratusA();
		Status concreteB = new ConcreteStratusB();
		context.setStatus(concreteA);
		context.operation();
		context.setStatus(concreteB);
		context.operation();
	}
}

已知應用

相關模式

狀態模式與策略模式:
1、狀態模式的類圖和策略模式類似,並且都是能夠動態改變對象的行爲。
2、兩者的意圖不同: 狀態模式主要是用來解決狀態轉移的問題,當狀態發生轉移了,那麼 Context 對象就會改變它的行爲;而策略模式主要是用來封裝一組可以互相替代的算法族,並且可以根據需要動態地去替換 Context 使用的算法。
3、狀態模式是通過狀態轉移來改變 Context 所組合的 State 對象,而策略模式是通過 Context 本身的決策來改變組合的 Strategy 對象。

狀態轉移,是指 Context 在運行過程中由於一些條件發生改變而使得 State 對象發生改變。

參考資料

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