狀態模式和策略模式的快速區別方法

一句話區分

策略模式:我主動選擇算法(主動切換)
狀態模式:狀態自動轉換行為(被動切換)


實戰快速判斷方法

看"誰來決定"行為

  • 策略模式客户端決定使用哪個算法
  • 狀態模式狀態對象自己決定下一個狀態

場景測試法

問自己這個問題:如果我要改變當前的行為,是我手動設置,還是行為執行過程中自動觸發?

// 策略模式 - 我手動設置
context.setStrategy(new ConcreteStrategyA());

// 狀態模式 - 狀態自己決定
context.request(); // 內部可能自動切換到下一個狀態

具體判斷標準

1. 控制權判斷

  • 策略模式client.setStrategy() - 控制權在外部
  • 狀態模式state.handle() - 控制權在狀態內部

2. 切換時機判斷

  • 策略模式:切換髮生在配置階段
  • 狀態模式:切換髮生在運行階段

3. 意圖判斷

  • 策略模式:解決多種算法選擇問題
  • 狀態模式:解決對象狀態轉換問題

做題場景快速應用

題目分析流程:

  1. 看問題描述
  • 如果強調"根據條件選擇不同算法" → 策略模式
  • 如果強調"對象在不同狀態下行為不同" → 狀態模式

經典題型識別:

策略模式題目特徵

  • “根據用户類型計算不同折扣”
  • “根據支付方式選擇不同支付策略”
  • “根據文件類型使用不同解析器”
  1. 看狀態轉換
  • 如果狀態轉換邏輯在客户端策略模式
  • 如果狀態轉換邏輯在狀態類中狀態模式

直觀代碼區別

策略模式體驗:

// 感覺像在"裝配"對象
PaymentStrategy strategy;
if (user.isVIP()) {
    strategy = new VIPPaymentStrategy();
} else {
    strategy = new NormalPaymentStrategy();
}
// 我在控制用哪個策略

狀態模式體驗:

// 感覺像在"委託"行為
context.request(); // 我不關心狀態怎麼變

考試做題技巧

選擇題快速排除:

如果看到以下關鍵詞,優先考慮策略模式

  • “算法族”
  • “可互換”
  • “動態選擇”

設計題答題步驟:

  1. 識別核心問題:是要選擇算法?還是要管理狀態轉換?
  2. 畫類圖時
  • 策略模式:箭頭從Client指向Context
  • 狀態模式:箭頭在狀態類之間循環

總結:快速決策流程

問題 → 誰決定行為變化? → 
    ↓
    我決定 → 策略模式
    ↓
    狀態自己決定 → 狀態模式

實際開發中:如果需要手動切換行為,用策略模式;如果行為會根據內部條件自動變化,用狀態模式。