iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
自我挑戰組

Design Pattern - 無所不在的設計模式系列 第 27

[Day27] Design Pattern - Strategy 策略模式

  • 分享至 

  • xImage
  •  

定義


Strategy is a behavioral design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.
--Refactoring Guru

策略模式是一種行為型設計模式,它允許你定義一系列的演算法,將每個演算法放入獨立的類別中,並使它們的物件可以相互替換。

策略模式通常用在


策略模式通常用在以下情境:

  1. 演算法的多樣性:當你的應用需要支援多個不同的演算法或策略,並希望能夠在執行時根據情況切換或選擇合適的策略時。

  2. 避免條件語句複雜:當發現程式碼中存在大量的條件語句(if-else),來選擇不同的行為或演算法時,策略模式可以幫助將這些條件語句變得更容易理解和維護。

  3. 動態配置行為:需要在執行時能夠動態地切換應用的行為,而不必重新編譯程式碼。

  4. 分離演算法實作:當您希望分離不同演算法的實作,以便進行單獨測試和維護。這使得每個演算法都可以在獨立的類別中實作,提高了程式碼的可讀性和可維護性。

  5. 遵循開放/封閉原則:當你希望能夠輕鬆地擴展系統以支援新的策略,而不必修改現有的程式碼。

  6. 行為的共享:當多個不同的對象需要共享相同的演算法,策略模式可以幫助避免重複的程式碼。

策略模式的靈活性和可維護性使它成為處理具有多個變動部分的系統的有用工具,同時有助於減少代碼複雜度和提高程式設計的模組化。

策略模式和狀態模式的不同之處


乍看之下兩個模式是不是有點像呢~~
我昨天就被搞混了

我們來比較一下兩者~

特徵 策略模式(Strategy) 狀態模式(State)
問題背景 選擇不同算法或策略,實現相同目標 管理內部狀態,基於狀態改變行為
用途 用於選擇不同的算法或策略,使客戶端能夠在執行時切換策略以達到相同的目標。 用於管理對象的內部狀態,並基於狀態的變化來改變對象的行為。它處理的是對象的生命週期和狀態遷移。
關注點 不同策略之間的替換性和選擇性 對象的內部狀態及其影響行為,處理狀態轉換
結構 通常包括上下文(Context)和具體策略(Concrete Strategy)這兩個主要元素,以及策略(Strategy)介面或抽象類別。 通常包括上下文(Context)和不同狀態(State)這兩個主要元素,以及狀態(State)介面或抽象類別。

狀態模式的元素


狀態模式通常包括以下元素:

  • 策略(介面或抽象類別)
    這定義了所有支援的演算法所共有的介面。上下文(Context)使用這個介面來呼叫由具體策略(ConcreteStrategy)所定義的演算法。
  • 具體策略(ConcreteStrategy):
    實作了策略介面,使用該介面來實現具體的演算法。
  • 上下文(Context)
    維護對策略物件的參照,並可定義一個介面,讓策略可以存取其資料。

UML


C#簡易實作


我們來寫一個簡單的C#加減法~利用策略模式的邏輯

首先是介面:

// 策略介面
public interface IOperation
{
    int Execute(int a, int b);
}

再來是兩個具體策略,一個是加法一個是減法~

// 具體策略 - 加法
public class Addition : IOperation
{
    public int Execute(int a, int b)
    {
        return a + b;
    }
}

// 具體策略 - 減法
public class Subtraction : IOperation
{
    public int Execute(int a, int b)
    {
        return a - b;
    }
}

Context上下文:

// 上下文
public class Calculator
{
    private IOperation operation;

    public Calculator(IOperation operation)
    {
        this.operation = operation;
    }

    public void SetOperation(IOperation operation)
    {
        this.operation = operation;
    }

    public int Calculate(int a, int b)
    {
        return operation.Execute(a, b);
    }
}

我們的主程式

class Program
{
    static void Main()
    {
        // 創建計算機上下文,並設定加法策略
        Calculator calculator = new Calculator(new Addition());

        int result1 = calculator.Calculate(5, 3);
        Console.WriteLine("加法結果: " + result1);

        // 切換策略為減法
        calculator.SetOperation(new Subtraction());

        int result2 = calculator.Calculate(10, 4);
        Console.WriteLine("減法結果: " + result2);
    }
}

output:


上一篇
[Day26] Design Pattern - State狀態模式
下一篇
[Day28] Design Pattern - Template method模板方法模式
系列文
Design Pattern - 無所不在的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言