C# 设计模式系列教程-策略模式

首先我们来介绍一下“C# 设计模式系列教程-策略模式”的概念。

策略模式

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。通过定义多个算法类实现同一个接口,并且可以随时切换算法,使得客户端程序能够根据不同的情况选择不同的算法。

策略模式的角色

策略模式涉及到三个角色:

  • 上下文(Context):拥有多个算法类对象,维护一个对于策略对象的引用,可以在运行时切换其所用的算法。

  • 抽象策略(Strategy):定义了一个公共的接口,所有的策略都要实现这个接口。

  • 具体策略(ConcreteStrategy):实现了抽象策略所定义的接口,提供了一种具体的算法实现。

策略模式的优点

策略模式的优点主要有三个:

  • 可以在运行时切换算法。
  • 可以避免使用多重条件语句。
  • 每个具体策略类都可以单独进行测试和维护,符合单一职责原则。

下面我们来看一下策略模式的两个示例。

示例一:策略模式应用于排序

首先我们来看一个排序的例子,通过策略模式实现不同的排序算法。

我们先定义一个 IStrategy 接口,其中包含一个排序方法 Sort:

public interface IStrategy
{
    void Sort(int[] data);
}

然后我们定义 BubbleSort、QuickSort 和 MergeSort 三个具体的策略类,分别实现 IStrategy 接口:

public class BubbleSort : IStrategy
{
    public void Sort(int[] data)
    {
        // 冒泡排序算法
    }
}

public class QuickSort : IStrategy
{
    public void Sort(int[] data)
    {
        // 快速排序算法
    }
}

public class MergeSort : IStrategy
{
    public void Sort(int[] data)
    {
        // 归并排序算法
    }
}

最后我们定义 Context 上下文类,其中包含一个 IStrategy 类型的私有字段,以及一个 SetStrategy 方法和一个 Sort 方法:

public class Context
{
    private IStrategy _strategy;

    public void SetStrategy(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void Sort(int[] data)
    {
        _strategy.Sort(data);
    }
}

在客户端程序中,我们可以通过 SetStrategy 方法设置具体的排序算法,然后调用 Sort 方法进行排序:

int[] data = new int[] { 1, 3, 2, 4, 6, 5 };

Context context = new Context();
context.SetStrategy(new BubbleSort());
context.Sort(data);

context.SetStrategy(new QuickSort());
context.Sort(data);

context.SetStrategy(new MergeSort());
context.Sort(data);

示例二:策略模式应用于支付

接下来我们来看一个支付的例子,通过策略模式实现不同的支付方式。

首先我们定义一个 IStrategy 接口,其中包含一个支付方法 Pay:

public interface IStrategy
{
    void Pay(decimal amount);
}

然后我们定义 Alipay、WechatPay 和 UnionPay 三个具体的策略类,分别实现 IStrategy 接口:

public class Alipay : IStrategy
{
    public void Pay(decimal amount)
    {
        // 支付宝支付
    }
}

public class WechatPay : IStrategy
{
    public void Pay(decimal amount)
    {
        // 微信支付
    }
}

public class UnionPay : IStrategy
{
    public void Pay(decimal amount)
    {
        // 银联支付
    }
}

最后我们定义 Context 上下文类,其中包含一个 IStrategy 类型的私有字段,以及一个 SetStrategy 方法和一个 Pay 方法:

public class Context
{
    private IStrategy _strategy;

    public void SetStrategy(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void Pay(decimal amount)
    {
        _strategy.Pay(amount);
    }
}

在客户端程序中,我们可以通过 SetStrategy 方法设置具体的支付方式,然后调用 Pay 方法进行支付:

decimal amount = 100m;

Context context = new Context();
context.SetStrategy(new Alipay());
context.Pay(amount);

context.SetStrategy(new WechatPay());
context.Pay(amount);

context.SetStrategy(new UnionPay());
context.Pay(amount);

这样就实现了根据不同的情况选择不同的支付方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 设计模式系列教程-策略模式 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • ASP.NET 定制简单的错误处理页面实现代码

    ASP.NET 是一种非常流行的 Web 应用程序开发框架,当应用程序出现错误时,可以通过定制错误处理页面来提供更好的用户体验。 下面是实现自定义错误处理页面的步骤: 1. 关闭自定义错误 在应用程序的 Web.config 文件中,需要先关闭系统自定义错误页面的功能,以便能够自定义错误处理页面。 实现代码如下: <system.web> &lt…

    C# 2023年5月31日
    00
  • 使用 CliWrap 让C#中的命令行交互(推荐)

    使用 CliWrap 可以让 C# 中的命令行交互变得更加方便和高效。下面是具体的步骤和示例说明。 环境准备 在开始使用 CliWrap 之前,需要先确保电脑上已经安装了 .NET Core 开发环境。可以在终端中输入下面的命令检查。 dotnet –version 如果输出了版本号,则说明已经安装了 .NET Core。否则需要去官网下载并安装。 另外,…

    C# 2023年6月3日
    00
  • c# 实现RSA非对称加密算法

    C# 实现RSA非对称加密算法攻略 RSA加密算法简介 RSA加密算法是一种非对称加密算法,常用于网络通信中的数据加密。 该算法利用了两个相对来说很大的质数来生成公钥与私钥。公钥可自由分发,用于数据的加密;而私钥则由加密方自己保存,用于解密已被加密的数据。因为公钥可以公开,所以RSA加密算法是非对称加密;而且基于数论,经过加解密后,保证了数据的完整性、保密性…

    C# 2023年6月6日
    00
  • 浅析依赖注入框架Autofac的使用

    浅析依赖注入框架Autofac的使用 什么是依赖注入 依赖注入(Dependency Injection,DI)是一种设计模式,它可以将组件的依赖关系设计清晰、易于维护、易于测试。依赖注入主要是通过构造函数、属性和接口注入的方式将组件依赖关系解耦。在DI中,组件不再关注如何获取依赖组件,而是将依赖的对象交由其他组件来注入。 Autofac框架简介 Autof…

    C# 2023年5月31日
    00
  • C#自定义IP输入框控件

    那么下面我们来详细讲解一下如何实现C#自定义IP输入框控件。 1. 需求分析 我们需要自定义一个IP地址输入框控件,要求用户可以在文本框中输入0~255之间的数字,并以“.”分隔开4段,组成一个完整的IP地址。 2. 控件的设计 我们设计的自定义IP输入框控件,需要包含以下属性和方法: 属性: IPAddr:获取或设置IP地址的值。 方法: CreatePa…

    C# 2023年5月15日
    00
  • C#执行DOS命令的方法

    C#可以通过 System.Diagnostics.Process 类来实现执行DOS命令的功能。 具体步骤如下: 1. 引入命名空间 using System.Diagnostics; 2. 实例化Process对象 Process process = new Process(); 3. 配置Process对象属性 我们需要设置 ProcessStartI…

    C# 2023年6月1日
    00
  • asp.net core中灵活的配置方式详解

    ASP.NET Core中灵活的配置方式详解 ASP.NET Core提供了多种配置方式,以便开发人员可以根据应用程序的需要选择最适合的配置方式。本文将介绍ASP.NET Core中的灵活配置方式,包括: appsettings.json文件 环境变量 命令行参数 用户机密存储 1. appsettings.json文件 appsettings.json文件…

    C# 2023年5月16日
    00
  • java servlet结合Oracle搭建java的web开发环境

    javaservlet结合Oracle搭建java的web开发环境 在Java的Web开发中,常常需要使用Java Servlet和Oracle数据库。本文将介绍如何结合Java Servlet和Oracle搭建Java的Web开发环境。 步骤1:安装Oracle数据库 首先,我们需要安装Oracle数据库。可以从Oracle官网下载并安装Oracle数据库…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部