[C#] #6 策略模式與介面在C#中的應用 - antqtech/KM GitHub Wiki

策略模式(Strategy Pattern)是一種行為設計模式,它允許在運行時選擇算法或行為,而不是在編譯時確定。這種模式通過定義一系列算法,並將每個算法封裝起來,使得它們可以互換,從而讓算法的變化不會影響到使用算法的客戶端。

策略模式的基本結構

策略模式通常包括以下幾個部分:

  1. 策略介面(Strategy Interface):定義算法或行為的介面。
  2. 具體策略(Concrete Strategies):實現策略介面的具體類別。
  3. 上下文(Context):持有一個策略物件的引用,並在需要時調用策略的方法。

範例:文本壓縮

我們以文本壓縮為例,展示如何使用策略模式來選擇不同的壓縮算法。

1. 定義策略介面

首先,我們定義一個壓縮策略介面 ICompressionStrategy

public interface ICompressionStrategy
{
    void Compress(string filePath);
}

2. 實現具體策略

接下來,我們創建兩個具體的壓縮策略類別,ZipCompressionRarCompression,它們都實現了 ICompressionStrategy 介面。

public class ZipCompression : ICompressionStrategy
{
    public void Compress(string filePath)
    {
        Console.WriteLine("Compressing using Zip.");
        // 具體的 Zip 壓縮實現
    }
}

public class RarCompression : ICompressionStrategy
{
    public void Compress(string filePath)
    {
        Console.WriteLine("Compressing using Rar.");
        // 具體的 Rar 壓縮實現
    }
}

3. 定義上下文

我們定義一個上下文類別 CompressionContext,它持有一個策略物件的引用,並在需要時調用策略的方法。

public class CompressionContext
{
    private ICompressionStrategy _strategy;

    public CompressionContext(ICompressionStrategy strategy)
    {
        _strategy = strategy;
    }

    public void SetStrategy(ICompressionStrategy strategy)
    {
        _strategy = strategy;
    }

    public void CreateArchive(string filePath)
    {
        _strategy.Compress(filePath);
    }
}

4. 使用策略模式選擇壓縮算法

現在,我們可以使用策略模式來選擇不同的壓縮算法。

class Program
{
    static void Main(string[] args)
    {
        CompressionContext context = new CompressionContext(new ZipCompression());
        context.CreateArchive("example.txt");  // Output: Compressing using Zip.

        context.SetStrategy(new RarCompression());
        context.CreateArchive("example.txt");  // Output: Compressing using Rar.
    }
}

優點與應用

優點

  1. 易於擴展:可以輕鬆添加新的策略類別,而不需要修改現有的程式碼。
  2. 靈活性高:可以在運行時動態地改變策略。
  3. 遵循開放/封閉原則:策略模式使得系統更易於擴展而不修改現有代碼。

應用場景

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

  1. 需要多種算法的應用場景:例如排序算法、數據壓縮算法、費率計算等。
  2. 算法需要在運行時動態改變:例如不同用戶、不同情況下需要使用不同的算法。
  3. 避免大量條件語句:將算法封裝在不同的策略類別中,減少條件語句,使代碼更清晰。

總結

策略模式是一種強大的設計模式,通過將算法封裝在策略類別中,提供了一種靈活且可擴展的算法選擇方式。介面在策略模式中扮演關鍵角色,提供了統一的契約,確保不同的策略具有一致的行為。通過理解和應用策略模式,我們可以更有效地管理算法選擇,提高程式碼的靈活性和可維護性。