首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式:狀態模式(State Pattern)完整指南

     編輯:Java 相關知識

什麼是狀態模式?

狀態模式屬於行為型模式,其核心思想是:允許對象在內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。將每種狀態封裝為獨立類別,並將狀態轉移邏輯分散到各狀態類中,避免龐大的 if-else 或 switch 判斷。

何時適用?

當一個對象的行為取決於其狀態,且狀態之間存在頻繁切換時:

  • 代碼中大量重複的 if (state == A) ... else if (state == B) ... 判斷。
  • 狀態轉移邏輯複雜,且可能新增狀態。
  • 典型場景:TCP 連接(建立、監聽、關閉)、銀行帳戶(開戶、凍結、關閉)、POP3 郵件協議、繪圖工具的工具切換等。

注意區分「普通條件判斷」與「狀態切換」:前者是根據外部變量決定輸出,後者是狀態自我流轉(如開關燈:關→開→關)。

模式結構與實作步驟

核心角色

  1. Context(狀態管理器):維護當前狀態引用,定義客戶端介面,委派行為給當前狀態對象。
  2. State(抽象狀態):定義處理請求的介面,封裝與特定狀態相關的行為。
  3. ConcreteState(具體狀態):實現抽象狀態介面,處理來自 Context 的請求,並決定下一個狀態。

代碼示例:顏色狀態切換

重構前:Context 中包含龐大的 push()/pull() 邏輯,狀態轉移硬編碼。

重構後:

// 1. 抽象狀態
public abstract class State {
    public abstract void handlePush(Context c);
    public abstract void handlePull(Context c);
    public abstract Color getColor();
}

// 2. 具體狀態
public class RedState extends State {
    public void handlePush(Context c) { c.setState(new BlueState()); }
    public void handlePull(Context c) { c.setState(new GreenState()); }
    public Color getColor() { return Color.RED; }
}
// BlueState, GreenState 類似...

// 3. Context 精簡為委派者
public class Context {
    private State state;
    public void setState(State s) { this.state = s; }
    public void push() { state.handlePush(this); }
    public void pull() { state.handlePull(this); }
}

優缺點權衡

優點缺點
消除巨大條件分支,代碼清晰增加類的數量,結構複雜化
狀態轉移邏輯集中在具體狀態類,易維護若狀態轉移極簡單(如單純賦值),引入模式反而過度設計
新增狀態只需新增類,符合開閉原則狀態類之間可能產生依賴

實戰建議

當狀態行為邏輯「足夠複雜」且「頻繁切換」時才使用。若只是簡單的布林標誌切換,if-else 更直接。記住:模式是為了解決複雜性,而非製造複雜性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved