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

Java 設計模式深度對比:狀態模式 vs 策略模式

     編輯:Java 相關知識

核心差異:意圖決定一切

雖然狀態模式與策略模式在 UML 結構上極度相似,皆遵循開閉原則,但意圖截然不同:

  • 策略模式:封裝一組相關算法,讓客戶端在運行時動態切換算法(如加密、排序、壓縮)。
  • 狀態模式:讓對象在不同狀態下展現不同行為,管理狀態轉移(如自動販賣機、訂單流程)。

關鍵區別點總覽

維度策略模式狀態模式
封裝對象算法/策略對象狀態
狀態轉移驅動者客戶端主動設定Context 或 State 內部管理
持有 Context 引用否是(用於狀態轉換)
可復用性高(獨立於上下文)低(與對象強耦合)
核心關注「如何做」(How)「什麼時候做什麼」(What & When)
單一職責原則符合視實現而定

代碼實戰:狀態模式示例

// 狀態介面
public interface State {
    void handle(Context ctx);
}

// 具體狀態:視窗模式
public class WindowState implements State {
    private String value;
    public WindowState(String v) { value = v; }
    public void handle(Context ctx) {
        if ("窗口".equals(value)) {
            System.out.println("切換為全屏模式");
            ctx.setState(new WindowState("全屏"));
        } else {
            System.out.println("切換為窗口模式");
            ctx.setState(new WindowState("窗口"));
        }
    }
}

// 上下文管理狀態
public class Context {
    private State state;
    public Context(State s) { state = s; }
    public void setState(State s) { state = s; }
    public void request() { state.handle(this); }
}

代碼實戰:策略模式示例

// 策略介面:收費算法
public interface CashStrategy {
    double acceptCash(double money);
}

// 正常收費
public class CashNormal implements CashStrategy {
    public double acceptCash(double m) { return m; }
}

// 打折策略
public class CashRebate implements CashStrategy {
    private double rebate;
    public CashRebate(double r) { rebate = r; }
    public double acceptCash(double m) { return m * rebate / 10; }
}

// 滿減策略
public class CashReturn implements CashStrategy {
    private double condition, returnMoney;
    public CashReturn(double c, double r) { condition = c; returnMoney = r; }
    public double acceptCash(double m) {
        return m >= condition ? m - (int)(m/condition)*returnMoney : m;
    }
}

// 上下文使用策略
public class CashContext {
    private CashStrategy strategy;
    public void setStrategy(CashStrategy s) { strategy = s; }
    public double getResult(double money) { return strategy.acceptCash(money); }
}

選型指南

  • 需動態切換算法、算法間無狀態依賴 → 策略模式
  • 對象行為隨內部狀態變化、需管理狀態轉移邏輯 → 狀態模式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved