C# 中的策略模式:从基础到高级

概述:策略模式是一种行为设计模式,支持在运行时选择算法的实现。代码不是直接实现单个算法,而是接收运行时指令,说明要使用一系列算法中的哪种算法。在这篇博客文章中,我们将探讨 C# 中的策略模式,从基础知识开始,逐步发展到高级方案。策略模式的基础知识概念策略模式是关于定义一系列算法,封装每个算法,并使它们可互换。它使算法独立于使用它的客户端而变化。参与者策略:定义所有受支持算法通用的接口。Context 使用此接口调用 ConcreteStrategy 定义的算法。ConcreteStrategy:使用 Strategy 接口实现算法。上下文:配置了 ConcreteStrategy 对象,并维护对 S

策略模式是一种行为设计模式,支持在运行时选择算法的实现。代码不是直接实现单个算法,而是接收运行时指令,说明要使用一系列算法中的哪种算法。在这篇博客文章中,我们将探讨 C# 中的策略模式,从基础知识开始,逐步发展到高级方案。

策略模式的基础知识

概念

策略模式是关于定义一系列算法,封装每个算法,并使它们可互换。它使算法独立于使用它的客户端而变化。

参与者

  1. 策略:定义所有受支持算法通用的接口。Context 使用此接口调用 ConcreteStrategy 定义的算法。

  2. ConcreteStrategy:使用 Strategy 接口实现算法。

  3. 上下文:配置了 ConcreteStrategy 对象,并维护对 Strategy 对象的引用。

实现简单

让我们从一个基本的例子开始:一个简单的计算器。

复制代码
// 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);  
    }  
}

策略模式的高级用法

1. 战略与工厂模式

将策略模式与工厂模式相结合,根据特定标准动态创建策略。当在运行时根据特定条件确定要使用的策略时,这种组合特别有用。

2. 依赖注入策略

现代应用程序通常使用依赖注入框架。这些框架可用于将策略注入上下文中,从而在不修改上下文的情况下更轻松地切换策略。

3. 状态与战略模式

虽然这两种模式都是关于封装行为的,但状态模式是关于让对象在其内部状态发生变化时改变其行为,而策略模式是关于让对象委托其行为。

4. 带有 Lambda 表达式的策略模式

在 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);  
    }  
}

5. 优点和缺点

优势:

  • 在一组复杂算法之间提供明确的分离。

  • 提倡开放/封闭原则。可以在不修改现有代码的情况下添加新策略。

  • 避免公开复杂的、特定于算法的数据结构。

缺点:

  • 可以增加应用程序中的对象数。

  • 客户必须了解不同的策略才能选择正确的策略。

真实场景和示例

  1. 电子商务折扣:电子商务平台可能具有不同的折扣算法。策略模式可以封装每个折扣算法,从而可以轻松地将不同的折扣应用于订单。

  2. 图像压缩:图像处理应用程序可能支持不同的压缩算法。策略模式可用于在不同的压缩方法之间轻松切换。

  3. 支付网关:一个电子商务平台可能支持多个支付网关。每个网关都可以作为一个策略来实现,从而可以轻松地在它们之间切换。

结论

策略模式是一种强大的设计模式,它通过将算法封装到易于交换的单独类中来促进解耦、灵活性和可维护性。在类有多种方式执行操作,并且所需的方法是在运行时确定的情况下,它特别有用。借助 C# 强大的面向对象特性和函数式编程功能,实现策略模式既直观又高效。无论您是构建复杂的业务系统还是简单的实用程序库,策略模式都可以成为您设计工具包中的宝贵工具。

相关推荐
Scott9999HH8 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
EIP低代码平台8 小时前
EIP 低代码平台 - 角色维护
低代码·c#·权限·工作流·netcore
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海9 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨10 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区12 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大13 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai13 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜13 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript