背景:
策略模式在我們實際專案開發中,使用的比較多的一種設計模式,直接貼一個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"); } }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/8145.html
標籤:ASP.NET
上一篇:c#設計模式之單例模式
