這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰程序員
- 📢歡迎點贊 :👍 收藏 ⭐留言 📝 若有錯誤敬請指正,賜人玫瑰,手留餘香!
- 📢本文做者:由webmote 原創,首發於 【掘金】
- 📢做者格言: 生活在於折騰,當你不折騰生活時,生活就開始折騰你,讓咱們一塊兒加油!💪💪💪
意圖: 定義一系列的算法,把這些算法設計爲可被互相替換。web
形象的說:雖然算法不一樣,但客戶端的執行調用均不用修改,不一樣的算法就如同不一樣的策略同樣,能夠被隨時替換。算法
問題領域:編程
解決方案: 咱們使用UML圖來描述它。設計模式
咱們定義一個接口或抽象類Strategy,並設計其接口,由具體的實現類實現不一樣的算法,這裏是ConcreteStrategy1和2類。markdown
Client就是一個使用者,其內部能夠實例化Strategy類,也能夠按照條件進行配置不一樣的Strategy類,具體的應用方法經過接口或抽象類進行調用,而避免直接選定具體的類。ide
效果:post
在 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
這是一個例子,咱們來按照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();
複製代碼
是的,經過上述的策略類,咱們能夠在客戶端代碼內,隨意切換策略實現類,實現互換的目的,固然若是引入配置信息,還能夠作到根據配置信息動態修改算法的功能。
你的項目內有無相似的場景,能夠拿來練練手哦。
策略模式側重於經過不一樣的算法達到相同的目的,關注點主要在對行爲的抽象上,因此策略模式通常都是基於接口的。
每篇的設計模式,都是看起來容易,每每寫起來很費力氣,這多是我在編程中大部分場景並無使用到他們,或者使用的比較少的緣故吧,甚至於沒有排在前面寫的模式,可能都歷來沒用過呢。
固然查找.net源碼,試圖從裏面找到咱們須要的設計模式也不是個輕鬆的活。
雖然設計模式已經有不少文章了,但我仍是但願能寫的不一樣,一方面加強本身的記憶,一方面也給.net 廣大程序員打打氣,看看支撐咱們的.net core源碼裏有多少設計模式可供咱們學習。
因此能翻看源碼的程序員不會差到哪裏去!😳
例行小結,理性看待!
結的是啥啊,結的是我想你點贊而不可得的寂寞。😳😳😳
👓都看到這了,還在意點個贊嗎?
👓都點讚了,還在意一個收藏嗎?
👓都收藏了,還在意一個評論嗎?