策略模式是針對一組演算法,將每個演算法封裝到具有公共介面的獨立的類中,從而使它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。 結構:策略模式是對演算法的包裝,是把使用演算法的責任和演算法本身分割開,委派給不同的對象負責。策略模式通常把一系列的演算法包裝到一系列的策略類裡面。用一句話慨括... ...
背景:
策略模式在我們實際項目開發中,使用的比較多的一種設計模式,直接貼一個demo處理供大家參考,如有不對的地方,多多指點交流
定義:
策略模式是針對一組演算法,將每個演算法封裝到具有公共介面的獨立的類中,
從而使它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。
角色:
環境角色(Context):持有一個Strategy類的引用
抽象策略角色(Strategy):這是一個抽象角色,通常由一個介面或抽象類來實現。
此角色給出所有具體策略類所需實現的介面。
具體策略角色(ConcreteStrategy):包裝了相關演算法或行為。
使用場景:
系統中如果有幾個產品分支,而每一次處理邏輯只會執行其中一個條分支,那麼這時可以考慮使用策略模式,易於後期的可擴展,避免大堆的if else
比如:
結算:複雜一點系統結算的時候,會根據不同的角色,其結算方式有所不同
支付:其實系統支付的時候,會有不同的支付渠道,用戶在實際支付的時候只會用一種支付渠道
主要優點:
策略類之間可以自由切換。由於策略類都實現同一個介面,所以使它們之間可以自由切換。
易於擴展。增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼。
主要缺點:
使用方需要瞭解所有策略實現,並自行決定調用那一策略。
為了使用方靈活,可以採用依賴註入方式來處理,微軟提供了一個依賴註入技術:unity,可以參考使用
代碼示例:
using Microsoft.Practices.Unity.Configuration; using System; using System.Configuration; using Unity; /// <summary> /// 定義:策略模式是針對一組演算法,將每個演算法封裝到具有公共介面的獨立的類中, /// 從而使它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。 /// 結構:策略模式是對演算法的包裝,是把使用演算法的責任和演算法本身分割開,委派給不同的對象負責。 /// 策略模式通常把一系列的演算法包裝到一系列的策略類裡面。用一句話慨括策略模式就是 /// ——“將每個演算法封裝到不同的策略類中,使得它們可以互換” /// 角色: /// 環境角色(Context):持有一個Strategy類的引用 /// 抽象策略角色(Strategy):這是一個抽象角色,通常由一個介面或抽象類來實現。 /// 此角色給出所有具體策略類所需實現的介面。 /// 具體策略角色(ConcreteStrategy):包裝了相關演算法或行為。 /// /// 主要優點: //···策略類之間可以自由切換。由於策略類都實現同一個介面,所以使它們之間可以自由切換。 //···易於擴展。增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼。 //···避免使用多重條件選擇語句,充分體現面向對象設計思想。 // 主要缺點: //··客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。 //```這點可以考慮使用IOC容器和依賴註入的方式來解決,關於IOC容器和依賴註入(Dependency Inject) /// </summary> namespace StragetyPattern { // 步驟 1 抽象策略角色 //創建一個介面。 public interface Strategy { int doOperation(int num1, int num2); } // 步驟 2 具體策略角色 //創建實現介面的實體類。 public class OperationAdd : Strategy { public int doOperation(int num1, int num2) { return num1 + num2; } } public class OperationSubstract : Strategy { public int doOperation(int num1, int num2) { return num1 - num2; } } public class OperationMultiply : Strategy { public int doOperation(int num1, int num2) { return num1 * num2; } } // 步驟 3 環境角色 //創建 Context 類。調度作用 public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2) { return strategy.doOperation(num1, num2); } } // 步驟 4 //使用 Context 來查看當它改變策略 Strategy 時的行為變化。 public class Program { private static IUnityContainer container = null; static void Main(string[] args) { RegisterContainer(); Context context = new Context(container.Resolve<Strategy>("ADD")); Console.WriteLine("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(container.Resolve<Strategy>("SUB")); Console.WriteLine("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(container.Resolve<Strategy>("MUL")); Console.WriteLine("10 * 5 = " + context.executeStrategy(10, 5)); Console.ReadKey(); } private static void RegisterContainer() { container = new UnityContainer(); UnityConfigurationSection config = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName); config.Configure(container, "Programmer"); } } }