策略模式將「演算法族群」封裝為可互換的類別,讓客戶端在執行時動態切換策略。本文以「諸葛亮三個錦囊妙計」為情境,完整展示介面、具體策略、Context 封裝類、客戶端切換邏輯,並分析優缺點、適用場景與避免過度設計的原則。
IStrategy { void operate(); }。operate(),隔離高層模組與具體策略。interface IStrategy { void operate(); }
class BackDoor implements IStrategy { // 錦囊一:找喬國老
public void operate() { System.out.println("找喬國老施壓,孫權不敢殺劉備..."); }
}
class GivenGreenLight implements IStrategy { // 錦囊二:求吳國太
public void operate() { System.out.println("求吳國太開綠燈,放行!"); }
}
class BlackEnemy implements IStrategy { // 錦囊三:孫夫人斷後
public void operate() { System.out.println("孫夫人斷後,擋住追兵..."); }
}
class Context {
private final IStrategy strategy;
public Context(IStrategy s) { strategy = s; }
public void operate() { strategy.operate(); }
}
public class ZhaoYun {
public static void main(String[] args) {
Context ctx;
ctx = new Context(new BackDoor()); ctx.operate(); // 剛到吳國
ctx = new Context(new GivenGreenLight()); ctx.operate(); // 劉備流連忘返
ctx = new Context(new BlackEnemy()); ctx.operate(); // 孫權追兵至
}
}
| 優點 | 缺點 |
|---|---|
| 策略類別可自由切換,符合開閉原則 | 策略類過多(>5)維護成本高 |
| 避免大量 if-else/switch 判斷邏輯 | 客戶端必須知曉所有策略細節,違反迪米特法則 |
| 易於單元測試各策略獨立邏輯 | 若策略間有共同邏輯,需配合模板方法模式抽取 |
策略模式常與工廠模式、模板方法模式混用。實務上若策略少於 3 種且固定,直接 if-else 更簡潔;隨著策略增多或頻繁擴充,再重構為策略模式不遲。