C#設計模式之策略模式


 

 背景:

  策略模式在我們實際項目開發中,使用的比較多的一種設計模式,直接貼一個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");
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM