.Net 設計模式進階之路——策略模式[Strategy]

這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰程序員

  • 📢歡迎點贊 :👍 收藏 ⭐留言 📝 若有錯誤敬請指正,賜人玫瑰,手留餘香!
  • 📢本文做者:由webmote 原創,首發於 【掘金】
  • 📢做者格言: 生活在於折騰,當你不折騰生活時,生活就開始折騰你,讓咱們一塊兒加油!💪💪💪

🎏 01.代理模式

意圖: 定義一系列的算法,把這些算法設計爲可被互相替換。web

形象的說:雖然算法不一樣,但客戶端的執行調用均不用修改,不一樣的算法就如同不一樣的策略同樣,能夠被隨時替換。算法

image.png

問題領域:編程

  • 有許多不一樣的算法,不但願被硬編碼到系統,
  • 算法能夠按照狀況互換,
  • 算法內的其餘數據不但願暴露出去,
  • 舊系統重構,發現不少if分支的語句,能夠考慮替換

解決方案: 咱們使用UML圖來描述它。設計模式

image.png

咱們定義一個接口或抽象類Strategy,並設計其接口,由具體的實現類實現不一樣的算法,這裏是ConcreteStrategy1和2類。markdown

Client就是一個使用者,其內部能夠實例化Strategy類,也能夠按照條件進行配置不一樣的Strategy類,具體的應用方法經過接口或抽象類進行調用,而避免直接選定具體的類。ide

效果:post

  • 好處:
  1. 能夠擴算法系列;
  2. 能夠替代直接繼承的方案,避免把算法硬編碼到使用類;
  3. 消除分支語句;
  4. 客戶能夠有多種選擇;
  • 限定:
  1. 客戶須要知道算法的不一樣點。
  2. 增長了對象數

🎏 02. dotnet core 源碼賞析

aspnet Core源代碼內有一個驗證策略的接口IValidationStrategy,採用了策略模式。學習

public interface IValidationStrategy
    {       
        IEnumerator<ValidationEntry> GetChildren(ModelMetadata metadata, string key, object model);
    }
    internal class DefaultComplexObjectValidationStrategy : IValidationStrategy
    {

        public static readonly IValidationStrategy Instance = new DefaultComplexObjectValidationStrategy();

        private DefaultComplexObjectValidationStrategy()
        {
        }

        /// <inheritdoc />
        public IEnumerator<ValidationEntry> GetChildren( ModelMetadata metadata, string key, object model)
        {
            return new Enumerator(metadata, key, model);
        }

        
        }
  }
複製代碼

策略模式並不難理解,只要合適的場景就能夠引入它。ui

🎏 03. dotnet 代理類實現

這是一個例子,咱們來按照uml圖的設計實現一個策略類,接口定義以下:

public abstract class Strategy
    {
        public abstract void AlgorithmInterface();
    }    
    public class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine(
                "Called ConcreteStrategyA.AlgorithmInterface()");
        }
    }   
    public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine(
                "Called ConcreteStrategyB.AlgorithmInterface()");
        }
    }
    public class Client
    {
        Strategy strategy;
        // Constructor
        public Client(Strategy strategy)
        {
            this.strategy = strategy;
        }
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }
複製代碼

調用方,能夠按照下列方式直接使用。

Client context;
// Two contexts following different strategies
context = new Client(new ConcreteStrategyA());
context.ContextInterface();
context = new Client(new ConcreteStrategyB());
context.ContextInterface();
複製代碼

是的,經過上述的策略類,咱們能夠在客戶端代碼內,隨意切換策略實現類,實現互換的目的,固然若是引入配置信息,還能夠作到根據配置信息動態修改算法的功能。

你的項目內有無相似的場景,能夠拿來練練手哦。

🎏 04. 小結

策略模式側重於經過不一樣的算法達到相同的目的,關注點主要在對行爲的抽象上,因此策略模式通常都是基於接口的。

每篇的設計模式,都是看起來容易,每每寫起來很費力氣,這多是我在編程中大部分場景並無使用到他們,或者使用的比較少的緣故吧,甚至於沒有排在前面寫的模式,可能都歷來沒用過呢。

固然查找.net源碼,試圖從裏面找到咱們須要的設計模式也不是個輕鬆的活。

雖然設計模式已經有不少文章了,但我仍是但願能寫的不一樣,一方面加強本身的記憶,一方面也給.net 廣大程序員打打氣,看看支撐咱們的.net core源碼裏有多少設計模式可供咱們學習。

因此能翻看源碼的程序員不會差到哪裏去!😳

例行小結,理性看待!

結的是啥啊,結的是我想你點贊而不可得的寂寞。😳😳😳

👓都看到這了,還在意點個贊嗎?

👓都點讚了,還在意一個收藏嗎?

👓都收藏了,還在意一個評論嗎?

相關文章
相關標籤/搜索