後端開發 設計模式 · 第 22 / 24 篇

策略模式:靈活切換行為的好幫手

策略模式 (Strategy Pattern) 讓你定義一系列演算法並能靈活互換。本文以 C# 交通工具選擇範例,示範如何提升程式的彈性與可維護性。

哈囉朋友們~今天我們要介紹的設計模式是非常靈活好用的策略模式(Strategy),透過它,你可以輕鬆替換不同的行為,讓你的程式更有彈性!

🌟 策略模式是什麼?

策略模式允許你定義一系列的演算法,並讓這些演算法可以互相替換,且獨立於使用它們的客戶端。

想像一下,你去旅行時可以選擇不同的交通方式,比如搭飛機、搭高鐵或開車。你根據不同的需求(時間、成本、舒適度)選擇不同的策略,這就是策略模式的核心概念!


🤔 什麼情況適合使用策略模式?

以下情況很適合使用策略模式:

  • 需要動態地切換不同的演算法或行為。
  • 想避免使用大量的條件判斷語句(if-else 或 switch)。
  • 希望使系統容易擴充,能輕鬆增加新的演算法或行為。

🚗 C# 策略模式範例:旅遊交通工具選擇

這次我們以旅遊時選擇交通工具作為範例。

🚅 定義策略介面

/// <summary>
/// 交通策略介面
/// </summary>
public interface ITravelStrategy
{
    /// <summary>
    /// 前往指定目的地
    /// </summary>
    /// <param name="destination">目的地</param>
    void Travel(string destination);
}

✈️ 建立具體策略類別

using System;

/// <summary>
/// 飛機策略
/// </summary>
public class PlaneStrategy : ITravelStrategy
{
    public void Travel(string destination)
    {
        Console.WriteLine($"搭飛機前往 {destination}");
    }
}

/// <summary>
/// 高鐵策略
/// </summary>
public class HighSpeedRailStrategy : ITravelStrategy
{
    public void Travel(string destination)
    {
        Console.WriteLine($"搭高鐵前往 {destination}");
    }
}

/// <summary>
/// 汽車策略
/// </summary>
public class CarStrategy : ITravelStrategy
{
    public void Travel(string destination)
    {
        Console.WriteLine($"開車前往 {destination}");
    }
}

🎒 建立 Context 類別(旅客)

/// <summary>
/// 旅客
/// </summary>
public class Traveler
{
    private ITravelStrategy _travelStrategy;

    /// <summary>
    /// 設定交通策略
    /// </summary>
    /// <param name="strategy">策略實例</param>
    public void SetStrategy(ITravelStrategy strategy)
    {
        _travelStrategy = strategy;
    }

    /// <summary>
    /// 前往目的地
    /// </summary>
    /// <param name="destination">目的地</param>
    public void TravelTo(string destination)
    {
        _travelStrategy.Travel(destination);
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        Traveler traveler = new Traveler();

        // 改變策略為搭飛機
        traveler.SetStrategy(new PlaneStrategy());
        traveler.TravelTo("東京");

        // 改變策略為搭高鐵
        traveler.SetStrategy(new HighSpeedRailStrategy());
        traveler.TravelTo("台南");

        // 改變策略為開車
        traveler.SetStrategy(new CarStrategy());
        traveler.TravelTo("宜蘭");
    }
}

🎯 執行結果

搭飛機前往 東京
搭高鐵前往 台南
開車前往 宜蘭

⚠️ 策略模式使用注意事項

  • 優點:能靈活替換行為,避免大量的條件判斷,使程式更容易擴充與維護。
  • 缺點:可能會產生大量策略類別,增加程式碼的複雜性。

🎉 結語

恭喜你掌握了策略模式(Strategy)!透過這個模式,你的程式能輕鬆應對各種變化,靈活又好用!

繼續追蹤我們的設計模式系列,下篇再見啦~

系列:

讀完了!你覺得這篇如何?

你的回饋會決定下一篇要寫什麼。

還有疑問

Learning path

設計模式

這篇是系列中的第 22 / 24 篇。可以順著列表補完整脈絡,也可以直接跳到需要的段落。

  1. 01 搞懂設計模式到底是什麼?
  2. 02 單例模式:只要一個就夠!
  3. 03 工廠方法模式:點披薩不用親自下廚
  4. 04 抽象工廠模式:系列產品輕鬆生產
  5. 05 原型模式:複製的藝術
  6. 06 建造者模式:一步步完成複雜任務
  7. 07 介面卡模式:讓不相容也能合作
  8. 08 橋接模式:抽象與實作分離
  9. 09 組合模式:樹狀結構的好幫手
  10. 10 裝飾者模式:讓功能自由加點
  11. 11 外觀模式:化繁為簡
  12. 12 享元模式:節省記憶體的利器
  13. 13 代理模式:控制存取的守門員
  14. 14 責任鏈模式:層層把關的處理機制
  15. 15 命令模式:靈活封裝的請求指令
  16. 16 解譯器模式:讓程式聽懂你的指令
  17. 17 迭代器模式:輕鬆遍歷集合元素
  18. 18 中介者模式:管理複雜溝通的好幫手
  19. 19 備忘錄模式:保存與恢復物件狀態
  20. 20 觀察者模式:即時通知的好幫手
  21. 21 狀態模式:依狀態改變行為的祕訣
  22. 22 策略模式:靈活切換行為的好幫手 目前閱讀
  23. 23 模板方法模式:固定流程靈活實作
  24. 24 訪問者模式:新增功能不動既有架構

Further reading

中介者模式:管理複雜溝通的好幫手 封面圖 2025-06-13 中介者模式:管理複雜溝通的好幫手 備忘錄模式:保存與恢復物件狀態 封面圖 2025-06-13 備忘錄模式:保存與恢復物件狀態 模板方法模式:固定流程靈活實作 封面圖 2025-06-13 模板方法模式:固定流程靈活實作

留言討論

用 GitHub 帳號留言,留言會同步到這個 Blog 的 GitHub Discussions。

閱讀導覽

約 3 分鐘

本篇所在系列 · 第 22 / 24 篇

設計模式

  1. 搞懂設計模式到底是什麼?
  2. 單例模式:只要一個就夠!
  3. 工廠方法模式:點披薩不用親自下廚
  4. 抽象工廠模式:系列產品輕鬆生產
  5. 原型模式:複製的藝術
  6. 建造者模式:一步步完成複雜任務
  7. 介面卡模式:讓不相容也能合作
  8. 橋接模式:抽象與實作分離
  9. 組合模式:樹狀結構的好幫手
  10. 裝飾者模式:讓功能自由加點
  11. 外觀模式:化繁為簡
  12. 享元模式:節省記憶體的利器
  13. 代理模式:控制存取的守門員
  14. 責任鏈模式:層層把關的處理機制
  15. 命令模式:靈活封裝的請求指令
  16. 解譯器模式:讓程式聽懂你的指令
  17. 迭代器模式:輕鬆遍歷集合元素
  18. 中介者模式:管理複雜溝通的好幫手
  19. 備忘錄模式:保存與恢復物件狀態
  20. 觀察者模式:即時通知的好幫手
  21. 狀態模式:依狀態改變行為的祕訣
  22. 策略模式:靈活切換行為的好幫手
  23. 模板方法模式:固定流程靈活實作
  24. 訪問者模式:新增功能不動既有架構
看完整系列 24 篇