[C#] #6 策略模式與介面在C#中的應用 - antqtech/KM GitHub Wiki
策略模式(Strategy Pattern)是一種行為設計模式,它允許在運行時選擇算法或行為,而不是在編譯時確定。這種模式通過定義一系列算法,並將每個算法封裝起來,使得它們可以互換,從而讓算法的變化不會影響到使用算法的客戶端。
策略模式的基本結構
策略模式通常包括以下幾個部分:
- 策略介面(Strategy Interface):定義算法或行為的介面。
- 具體策略(Concrete Strategies):實現策略介面的具體類別。
- 上下文(Context):持有一個策略物件的引用,並在需要時調用策略的方法。
範例:文本壓縮
我們以文本壓縮為例,展示如何使用策略模式來選擇不同的壓縮算法。
1. 定義策略介面
首先,我們定義一個壓縮策略介面 ICompressionStrategy
。
public interface ICompressionStrategy
{
void Compress(string filePath);
}
2. 實現具體策略
接下來,我們創建兩個具體的壓縮策略類別,ZipCompression
和 RarCompression
,它們都實現了 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.
}
}
優點與應用
優點
- 易於擴展:可以輕鬆添加新的策略類別,而不需要修改現有的程式碼。
- 靈活性高:可以在運行時動態地改變策略。
- 遵循開放/封閉原則:策略模式使得系統更易於擴展而不修改現有代碼。
應用場景
策略模式適合用於以下情況:
- 需要多種算法的應用場景:例如排序算法、數據壓縮算法、費率計算等。
- 算法需要在運行時動態改變:例如不同用戶、不同情況下需要使用不同的算法。
- 避免大量條件語句:將算法封裝在不同的策略類別中,減少條件語句,使代碼更清晰。
總結
策略模式是一種強大的設計模式,通過將算法封裝在策略類別中,提供了一種靈活且可擴展的算法選擇方式。介面在策略模式中扮演關鍵角色,提供了統一的契約,確保不同的策略具有一致的行為。通過理解和應用策略模式,我們可以更有效地管理算法選擇,提高程式碼的靈活性和可維護性。