策略模式定義一組算法,將每個算法封裝起來並使它們可互換。它是對「組合優於繼承」原則的經典應用,讓算法的變化獨立於使用算法的客戶端。
interface SortStrategy { void sort(int[] arr); }
class QuickSort implements SortStrategy {
public void sort(int[] arr) { /* 快排實現 */ }
}
class BubbleSort implements SortStrategy {
public void sort(int[] arr) { /* 冒泡實現 */ }
}
class SortContext {
private SortStrategy strategy;
public SortContext(SortStrategy strategy) { this.strategy = strategy; }
public void executeSort(int[] arr) { strategy.sort(arr); }
}
// 客戶端動態切換
SortContext ctx = new SortContext(new QuickSort());
ctx.executeSort(data);
ctx = new SortContext(new BubbleSort()); // 運行時切換
ctx.executeSort(data);
策略模式將算法委託給獨立對象(組合),模板方法模式在父類定義算法骨架(繼承)。實際中常結合:抽象策略用抽象類封裝公共邏輯,具體策略覆蓋關鍵步驟,形成「策略+模板」混合模式。
| 優點 | 缺點 |
|---|---|
| 算法自由切換,運行時決策 | 策略類過多(>5)維護成本高 |
| 消除大量條件分支,代碼清晰 | 客戶端需知曉所有策略細節,違反迪米特法則 |
| 易於擴展新算法,符合開閉原則 | 策略對象創建開銷(可用工廠/單例優化) |
策略模式是面向對象多態思想的直接體現,將「做什麼」與「怎麼做」分離。善用它能讓系統在面對算法變化時保持優雅、可擴展,是消除 if-else 條件鏈的利器。