意圖
允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它所屬的類。
動機
在軟件開發過程中,應用程序中的有些對象可能會根據不同的情況做出不同的行爲,我們把這種對象稱爲有狀態的對象,而把影響對象行爲的一個或多個動態變化的屬性稱爲狀態。當有狀態的對象與外部事件產生互動時,其內部狀態會發生改變,從而使得其行爲也隨之發生改變。
適用性
通常在以下情況下可以考慮使用狀態模式:
- 當一個對象的行爲取決於它的狀態,並且它必須在運行時根據狀態改變它的行爲時,就可以考慮使用狀態模式。
- 一個操作中含有龐大的分支結構,並且這些分支決定於對象的狀態時。
結構
狀態模式模式的主要角色有:
- 抽象狀態類(
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 對象發生改變。
參考資料
- 《
Head First
設計模式》 - 圖說設計模式
- Java設計模式:23種設計模式全面解析(超級詳細)