狀態模式和策略模式的快速區別方法
一句話區分
策略模式:我主動選擇算法(主動切換)
狀態模式:狀態自動轉換行為(被動切換)
實戰快速判斷方法
看"誰來決定"行為
- 策略模式:客户端決定使用哪個算法
- 狀態模式:狀態對象自己決定下一個狀態
場景測試法
問自己這個問題:如果我要改變當前的行為,是我手動設置,還是行為執行過程中自動觸發?
// 策略模式 - 我手動設置
context.setStrategy(new ConcreteStrategyA());
// 狀態模式 - 狀態自己決定
context.request(); // 內部可能自動切換到下一個狀態
具體判斷標準
1. 控制權判斷
- 策略模式:
client.setStrategy()- 控制權在外部 - 狀態模式:
state.handle()- 控制權在狀態內部
2. 切換時機判斷
- 策略模式:切換髮生在配置階段
- 狀態模式:切換髮生在運行階段
3. 意圖判斷
- 策略模式:解決多種算法選擇問題
- 狀態模式:解決對象狀態轉換問題
做題場景快速應用
題目分析流程:
- 看問題描述:
- 如果強調"根據條件選擇不同算法" → 策略模式
- 如果強調"對象在不同狀態下行為不同" → 狀態模式
經典題型識別:
策略模式題目特徵:
- “根據用户類型計算不同折扣”
- “根據支付方式選擇不同支付策略”
- “根據文件類型使用不同解析器”
- 看狀態轉換:
- 如果狀態轉換邏輯在客户端 → 策略模式
- 如果狀態轉換邏輯在狀態類中 → 狀態模式
直觀代碼區別
策略模式體驗:
// 感覺像在"裝配"對象
PaymentStrategy strategy;
if (user.isVIP()) {
strategy = new VIPPaymentStrategy();
} else {
strategy = new NormalPaymentStrategy();
}
// 我在控制用哪個策略
狀態模式體驗:
// 感覺像在"委託"行為
context.request(); // 我不關心狀態怎麼變
考試做題技巧
選擇題快速排除:
如果看到以下關鍵詞,優先考慮策略模式:
- “算法族”
- “可互換”
- “動態選擇”
設計題答題步驟:
- 識別核心問題:是要選擇算法?還是要管理狀態轉換?
- 畫類圖時:
- 策略模式:箭頭從Client指向Context
- 狀態模式:箭頭在狀態類之間循環
總結:快速決策流程
問題 → 誰決定行為變化? →
↓
我決定 → 策略模式
↓
狀態自己決定 → 狀態模式
實際開發中:如果需要手動切換行為,用策略模式;如果行為會根據內部條件自動變化,用狀態模式。
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。