設計模式-策略模式

策略模式(Strategy Pattern)

類型:行為相關

定義:定義一群演算法,並封裝每個演算法,讓他們可以彼此交換使用。策略模式讓這些演算法在客戶端使用他們時能更加獨立。

解釋:透過切換類別的方式來改變使用的演算法,和狀態模式很像,不過策略模式偏向於函數導向設計的思考模式,目的是切換使用的演算法,包裝演算法的類別不應該保有狀態而改變演算法的行為,所有變化應該要由傳進的參數決定。

和狀態模式相比,策略模式應該是用不同的方法(策略)來做同一件事情,而狀態模式的內涵是要做不同的事情。

參與者有以下三個:

策略介面(Strategy):提供客戶端一個可以達到目的的策略。

策略實作類別(ConcreteStrategy):實做不同的演算法。

客戶端(Context):擁有一個策略介面,並可以切換使用的策略。

精神:改變策略。

目的:透過改變使用的策略,達成不改變原本物件的外觀卻改變了內部的演算法,增加演算法使用的靈活性。

使用時機:有很多相同目的的演算法需要可以被切換使用,且演算法內容不短的時候。

優點:消掉switch強化開閉原則的實現,分離程式邏輯,易於增加新策略。

缺點:類別爆炸,每個策略都要多一個類別。

 

簡易程式範例:

public interface ISortStrategy
{
    void Sort(int[] array);
}
public class QuickSortStrategy : ISortStrategy
{
    public void Sort(int[] array)
    {
    //實做快速排序
    }
}
public class InsertionSortStrategy : ISortStrategy
{
    public void Sort(int[] array)
    {
        //實做插入排序
    }
}
public class ShellSortStrategy : ISortStrategy
{
    public void Sort(int[] array)
    {
        //實做希爾排序
    }
}
public class Context
{
    public ISortStrategy SortStrategy { protected get; set; }
    public void Sort(int[] array)
    {
        SortStrategy?.Sort(array);
    }
}

UML 類圖(取自維基百科):

strategy_pattern_in_uml
策略模式UML

strategy-pattern-animation

1 thoughts on “設計模式-策略模式

發表留言