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

Java 策略模式實戰:運行時動態切換算法,消除臃腫條件分支

     編輯:Java 相關知識

策略模式定義一系列算法,封裝每一個,使它們可互換。本文以「四則運算」為例,展示如何將加減乘除封裝為獨立策略類,Context 運行時注入具體策略,徹底替代 if-else 鏈,實現開閉原則與單一職責。

模式結構

  • Strategy(抽象策略):定義算法公共介面
  • ConcreteStrategy(具體策略):實現具體算法邏輯
  • Context(環境角色):持有 Strategy 引用,委派執行

核心代碼

// 抽象策略
interface Strategy {
    void doOperation(int num1, int num2);
}

// 具體策略
class StrategyAdd implements Strategy {
    public void doOperation(int n1, int n2) {
        System.out.println("執行加法:" + n1 + "+" + n2 + "=" + (n1+n2));
    }
}
class StrategySub implements Strategy { /* 減法 */ }
class StrategyMul implements Strategy { /* 乘法 */ }
class StrategyDiv implements Strategy { /* 除法 */ }

// 環境角色
class Context {
    private Strategy strategy;
    public Context(Strategy strategy) { this.strategy = strategy; }
    public void execute(int n1, int n2) { strategy.doOperation(n1, n2); }
}

// 客戶端:運行時動態切換
public class Demo {
    public static void main(String[] args) {
        Context ctx = new Context(new StrategyAdd());
        ctx.execute(10, 5);  // 加法
        
        ctx = new Context(new StrategyDiv());
        ctx.execute(10, 5);  // 除法
    }
}

實戰場景:參數驅動策略選擇

實際開發中,常根據參數類型選擇策略。傳統寫法:

if (type == 1) return new StrategyA();
else if (type == 2) return new StrategyB();
// ...

策略模式重構:

// 策略工廠/註冊表
@Component
public class StrategyFactory {
    private final Map<Integer, Strategy> map = new HashMap<>();
    
    @PostConstruct
    public void init() {
        map.put(1, new StrategyA());
        map.put(2, new StrategyB());
        // 支援 Spring 自動掃描註冊:@Component 掃描所有 Strategy 實現類
    }
    
    public Strategy getStrategy(int type) {
        return map.getOrDefault(type, new DefaultStrategy());
    }
}

// 業務代碼極度簡潔
public Result process(Request req) {
    Strategy strategy = factory.getStrategy(req.getType());
    return strategy.execute(req);
}

優勢總結

  1. 算法自由切換:運行時注入不同實現,無需修改 Context
  2. 消除條件分支:將 if-else 分散至各策略類與工廠註冊
  3. 擴展性極強:新增算法只需新增類並註冊,不動核心邏輯
  4. 測試友好:每個策略可獨立單元測試,Context 可 Mock 策略

企業級應用案例

  • HttpServlet.service():根據 HTTP 方法分派 doGet/doPost 等策略
  • 支付渠道選擇:微信/支付寶/銀聯封裝為獨立策略
  • 促銷活動引擎:滿減/折扣/贈品/積分等策略動態組合
  • 日誌輸出格式:JSON/文本/關鍵值對策略化

策略模式不僅是「替換 if-else」,更是將業務變化點識別、封裝、標準化的架構思維。

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