策略模式(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 類圖(取自維基百科):
1 thoughts on “設計模式-策略模式”