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# 强大的面向对象特性和函数式编程功能,实现策略模式既直观又高效。无论您是构建复杂的业务系统还是简单的实用程序库,策略模式都可以成为您设计工具包中的宝贵工具。

相关推荐
LawrenceLan3 小时前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
txinyu的博客3 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz4 小时前
C语言第1章
c语言·开发语言
行者964 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon4 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio5 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词5 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派5 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
yeziyfx6 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
charlie1145141916 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式