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

ops/2024/10/23 9:29:15/

概述:策略模式是一种行为设计模式,支持在运行时选择算法的实现。代码不是直接实现单个算法,而是接收运行时指令,说明要使用一系列算法中的哪种算法。在这篇博客文章中,我们将探讨 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# 强大的面向对象特性和函数式编程功能,实现策略模式既直观又高效。无论您是构建复杂的业务系统还是简单的实用程序库,策略模式都可以成为您设计工具包中的宝贵工具。


http://www.ppmy.cn/ops/17639.html

相关文章

CentOS-7安装grafana

一、通用设置(分别在4台虚拟机设置) 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入: 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服…

第66天:API攻防-接口安全阿里云KEYPostmanDVWSXXE鉴权泄漏

案例一:安全问题-Dvws泄漏&鉴权&XXE 靶场地址:https://github.com/snoopysecurity/dvws-node 利用docker命令去启动 首先先注册一个账户 注册后登录点击admin area 发现点不进去 这里把bp打开但是不抓包,只做流量转发,进…

【R语言简介】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台,供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心,最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

战胜DALL·E 3和 Midjourney的开源模型来了——playground-v2.5

这是首次超越闭源AI模型的开源时刻。Playground AI 前不久宣布Playground v2.5正式开源。Playground v2.5 是美学质量方面最先进的开源模型,特别关注增强的颜色和对比度、改进的多纵横比生成以及改进的以人为中心的精细细节。并且在美学质量方面树立了新标准&#x…

微服务:Nacos注册中心

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Nacos注册中心 一、服务注册与发现1.启动Nacos…

lvgl 移植 stm32F429

LVGL 移植 stm32f429 使用ltdc驱动RGB屏,移植 lvgl8.4.0 前置准备 准备一个能点亮屏的程序下载lvgl源码 将源码添加到工程 lvgl-8.4.0\src\core 中所有 .c添加到工程 lvgl-8.4.0\src\draw 中所有.c添加到工程 lvgl-8.4.0\src\draw\sdl 中所有.c添加到工程 lv…

Centos 7 安装 RocketMQ 5.14(保姆级)

1.yum 安装 upunzip yum install -y unzip 2.创建文件夹存放RocketMQ, 安装之前需要安装JDK mkdir -p /opt/tools/rocketmq 3.下载 RocketMQ 上传到 /opt/tools/rocketmq RocketMQ 官网下载地址 4.切换目录、解压 cd /opt/tools/rocketmq unzip rocketmq-a…