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

相关推荐
耿雨飞1 分钟前
Python 后端开发技术博客专栏 | 第 08 篇 上下文管理器与类型系统 -- 资源管理与代码健壮性
开发语言·python
2601_9491942622 分钟前
Python爬虫完整代码拿走不谢
开发语言·爬虫·python
c***892040 分钟前
python爬虫——爬取全年天气数据并做可视化分析
开发语言·爬虫·python
aq55356001 小时前
C语言、C++和C#:三大编程语言核心差异详解
java·开发语言·jvm
并不喜欢吃鱼1 小时前
从零开始C++----七.继承及相关模型和底层(上篇)
开发语言·c++
沐知全栈开发1 小时前
XML CDATA
开发语言
APIshop1 小时前
Python 爬虫获取闲鱼商品详情 API 接口实战指南
开发语言·爬虫·python
代码羊羊2 小时前
rust-字符串(切片)、元组、结构体、枚举、数组
开发语言·后端·rust
逻辑驱动的ken2 小时前
Java高频面试考点场景题08
java·开发语言·面试·求职招聘·春招
W23035765732 小时前
【改进版】C++ 固定线程池实现:基于调用者运行的拒绝策略优化
开发语言·c++·线程池