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

Java 狀態模式輕鬆掌握:封裝狀態轉換,讓對象行為隨狀態動態變化

     編輯:Java 相關知識

狀態模式允許對象在內部狀態改變時改變其行為,對象看起來像是修改了它的類。本文通過「物體運動/靜止」經典案例,展示如何將狀態相關行為封裝至獨立類中,避免巨大的條件判斷塊,實現開閉原則。

模式結構

  • Context(環境角色):維持一個 State 實例,定義客戶端感興趣的介面
  • State(抽象狀態角色):定義封裝環境角色一個特定狀態所對應的行為
  • ConcreteState(具體狀態角色):實現抽象狀態定義的行為

核心代碼實現

// 環境角色
class Context {
    private State state;
    public void setState(State state) {
        System.out.println("給物體加持狀態");
        this.state = state;
    }
}

// 抽象狀態
interface State {
    void show(Context context);
}

// 具體狀態:運動
class Move implements State {
    public void show(Context context) {
        context.setState(this);
        System.out.println("物體處於運動狀態");
    }
}

// 具體狀態:靜止
class Stop implements State {
    public void show(Context context) {
        context.setState(this);
        System.out.println("物體處於靜止狀態");
    }
}

// 客戶端調用
public class Demo {
    public static void main(String[] args) {
        Context context = new Context();
        new Move().show(context);  // 輸出:給物體加持狀態 / 物體處於運動狀態
        new Stop().show(context);  // 輸出:給物體加持狀態 / 物體處於靜止狀態
    }
}

適用場景

  • 對象行為隨狀態改變且狀態較多(如訂單:待支付/已支付/已發貨/已完成/已取消/退款中)
  • 代碼包含大量與狀態相關的 if-else 或 switch 分支
  • 需要在運行時動態切換狀態,且狀態轉換邏輯固定

優缺點權衡

優點缺點
封裝狀態轉換規則,邏輯清晰狀態類過多時增加類數量
枚舉可能狀態,避免遺漏狀態轉換邏輯分散在各具體狀態類中
新增狀態無需修改 Context(開閉原則)不適用於狀態極少且固定的簡單場景
可讓多環境對象共享狀態實例(享元)

實戰擴展建議

  1. 狀態轉換控制:在具體狀態類中加入 canTransitionTo(State target) 方法,集中管理合法轉換路徑
  2. 狀態持久化:資料庫存儲狀態枚舉值,重建對象時根據值注入對應 State 實例
  3. 結合策略模式:若狀態行為僅是算法差異,可用 Strategy 替代,更輕量

狀態模式是處理複雜狀態機的利器,善用它能讓業務邏輯清晰可維護。

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