策略模式是一种行为设计模式,支持在运行时选择算法的实现。代码不是直接实现单个算法,而是接收运行时指令,说明要使用一系列算法中的哪种算法。在这篇博客文章中,我们将探讨 C# 中的策略模式,从基础知识开始,逐步发展到高级方案。
策略模式是关于定义一系列算法,封装每个算法,并使它们可互换。它使算法独立于使用它的客户端而变化。
让我们从一个基本的例子开始:一个简单的计算器。
// Strategy
public interface ICalculationStrategy
{
int Calculate(int value1, int value2);
}
// ConcreteStrategy
public class AdditionStrategy : ICalculationStrategy
{
public int Calculate(int value1, int value2)
{
return value1 + value2;
}
}
public class SubtractionStrategy : ICalculationStrategy
{
public int Calculate(int value1, int value2)
{
return value1 - value2;
}
}
// Context
public class Calculator
{
private ICalculationStrategy _strategy;
public Calculator(ICalculationStrategy strategy)
{
_strategy = strategy;
}
public int ExecuteCalculation(int value1, int value2)
{
return _strategy.Calculate(value1, value2);
}
}
将策略模式与工厂模式相结合,根据特定标准动态创建策略。当在运行时根据特定条件确定要使用的策略时,这种组合特别有用。
现代应用程序通常使用依赖注入框架。这些框架可用于将策略注入上下文中,从而在不修改上下文的情况下更轻松地切换策略。
虽然这两种模式都是关于封装行为的,但状态模式是关于让对象在其内部状态发生变化时改变其行为,而策略模式是关于让对象委托其行为。
在 C# 中,借助 lambda 表达式和委托,您可以实现轻量级策略模式,而无需定义多个策略类。
public delegate int CalculationStrategy(int value1, int value2);
public class Calculator
{
public int ExecuteCalculation(int value1, int value2, CalculationStrategy strategy)
{
return strategy(value1, value2);
}
}
优势:
缺点:
策略模式是一种强大的设计模式,它通过将算法封装到易于交换的单独类中来促进解耦、灵活性和可维护性。在类有多种方式执行操作,并且所需的方法是在运行时确定的情况下,它特别有用。借助 C# 强大的面向对象特性和函数式编程功能,实现策略模式既直观又高效。无论您是构建复杂的业务系统还是简单的实用程序库,策略模式都可以成为您设计工具包中的宝贵工具。