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日

相关文章

  • 浅谈几种常见语言的命名空间(Namespace)

    下面是关于几种常见语言的命名空间的详细讲解。 什么是命名空间 命名空间(namespace)是一种定义某个作用域可见标识符的方式,它在多个标识符命名冲突时提供了一种解决方案。可以将命名空间视为一个容器或一个名字的前缀,用于将相关的标识符分组。命名空间在不同语言中的实现方式可能有所不同,但基本思想是相似的。 常见语言中的命名空间实现方式 以下是几种常见语言中的…

    C# 2023年6月1日
    00
  • 在ASP.NET 2.0中操作数据之四十六:使用SqlDataSource控件检索数据

    使用SqlDataSource控件是ASP.NET中非常常用的一种操作数据库的方法,其可以通过配置的方式快速地连接数据库并检索数据。下面是使用SqlDataSource控件检索数据的完整攻略: 步骤一:准备数据库 在使用SqlDataSource控件前,需要确保已经准备好了数据库并且有可用的数据表。假设我们有一个名为Books的数据表,该表包含了BookID…

    C# 2023年5月31日
    00
  • C#实现对文件进行加密保护的示例代码

    下面是“C#实现对文件进行加密保护的示例代码”的完整攻略。 一、引言 对文件进行加密保护是信息安全领域中的一个重要问题。C# 是一种流行的编程语言,也是.NET平台的核心语言之一。在C#中,我们可以很容易地实现对文件的加密保护。本文将分享一些如何使用C#加密你的文档的方法和示例代码。 二、C#实现对文件进行加密保护的示例代码 下面是一个简单的示例代码,演示了…

    C# 2023年6月1日
    00
  • c# 静态类的使用场景

    下文是关于”C# 静态类的使用场景”的完整攻略。 什么是 C# 静态类 在 C# 中,静态类(Static Class)是指不能被实例化的类,该类中的所有成员都必须是静态的。同时,静态类不能被继承,因此它不能有实例。静态类通常用于封装工具方法,使这些方法可以作为应用程序的公用工具使用。 C# 静态类的使用场景 静态类的主要作用是封装公用的工具方法,以方便其他…

    C# 2023年5月31日
    00
  • 关于C#中async/await的用法实例详解

    关于C#中async/await的用法实例详解 什么是async/await async和await是C#语言中的异步编程关键字,使得开发者能够以一种更加简洁、优美的方式编写异步代码。 async用于修饰方法,表示这个方法是异步执行的,不会阻塞当前线程。await用于修饰一个异步操作,表示要等待该操作完成才能继续执行方法。 async/await的用法 1.…

    C# 2023年6月6日
    00
  • 深入理解C#中的枚举

    深入理解C#中的枚举 枚举是C#语言中经常使用的一种类型,是一组命名常量的集合。它为常量赋予了名称,提高了代码的可读性和可维护性。在本文中,我们将全面介绍C#中枚举的相关概念、用法和注意事项。 枚举的定义 C#中枚举的定义语法为: enum 枚举名 { 可命名常量1, 可命名常量2, … } 例如,定义一个表示星期的枚举: enum WeekDays {…

    C# 2023年5月15日
    00
  • 详解如何在ASP.NET Core中应用Entity Framework

    如何在 ASP.NET Core 中应用 Entity Framework Entity Framework 是一个对象关系映射(ORM)框架,可以将数据库中的数据映射到 .NET 对象中。在 ASP.NET Core 中,可以使用 Entity Framework 来访问和操作数据库。本攻略将详细介绍如何在 ASP.NET Core 中应用 Entity …

    C# 2023年5月17日
    00
  • .NET Core源码解析配置文件及依赖注入

    .NET Core源码解析配置文件及依赖注入 在本攻略中,我们将详细讲解.NET Core源码解析配置文件及依赖注入的技术及工作原理,并提供两个示例说明。 配置文件 .NET Core中的配置文件是一种用于存储应用程序配置信息的文件。配置文件可以包含应用程序的各种配置信息,如数据库连接字符串、日志级别、缓存设置等。在.NET Core中,配置文件通常使用JS…

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