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日

相关文章

  • C# wpf 通过HwndHost渲染视频的实现方法

    在C# WPF中,可以使用HwndHost类来实现通过渲染视频的实现方法。HwndHost类允许将Win32窗口嵌入到WPF应用程序中,从而实现在WPF应用程序中渲染视频的效果。本文将提供详解如何使用HwndHost类实现通过渲染视频的完整攻略,包括如何创建HwndHost对象、如何设置Win32窗口句柄、如何处理HwndHost事件等。同时,本文还提供两个…

    C# 2023年5月15日
    00
  • 区分c# 前台和后台线程

    要区分C#前台和后台线程,主要是要理解它们之间的区别以及相应的使用场景。以下是区分C#前台和后台线程的完整攻略: 什么是前台线程和后台线程 前台线程 前台线程是指在应用程序的主线程中创建的线程,这些线程会阻止应用程序的终止,只有在所有前台线程执行完成后应用程序才会退出。 后台线程 后台线程是指在应用程序中创建的没有阻止应用程序终止的线程,当所有前台线程都执行…

    C# 2023年6月7日
    00
  • ASP.NET MVC使用Session会话保持表单状态

    以下是“ASP.NET MVC使用Session会话保持表单状态”的完整攻略: 什么是Session会话 Session会话是一种机制,用于在ASP.NET MVC应程序保持用户状态。它允许您用户之间共享数据,并在用户浏览应用程序时保持数据的持久性。 ASP.NET使用Session会话保持表单状态 是ASP.NET MVC使用Session会话保持表单状态…

    C# 2023年5月12日
    00
  • c# Thread类线程常用操作详解

    c#Thread类线程常用操作详解 什么是Thread类 Thread 类提供了访问和操作线程的一系列方法和属性。开发人员可以新建和控制线程、设置线程的优先级、执行线程的暂停、继续、等待操作等。Thread 类定义在 System.Threading 命名空间中。 如何创建一个线程 使用 Thread 类来创建一个新线程: Thread thread1 = …

    C# 2023年5月15日
    00
  • c#连接mdf文件示例分享

    我们来详细讲解一下“C#连接MDF文件示例分享”的完整攻略。 什么是MDF文件? MDF文件是SQL Server数据库主文件的扩展名,它记录了SQL Server数据库的主要数据。在C#语言中,我们使用连接字符串来连接MDF文件,并进行数据库的相关操作。 连接MDF文件的准备工作 在进行连接操作之前,我们需要进行一些准备工作,这里有两个示例: 示例1:安装…

    C# 2023年5月31日
    00
  • C# 创建控制台应用程序

    C#创建控制台应用程序的完整攻略 在C#中,控制台应用程序是一种常见的应用程序类型,可以在命令行中运行。本文将提供一个完整的C#创建控制台应用程序的攻略,包括创建、编译、运行、调试等操作。 步骤1:创建控制台应用程序 要创建控制台应用程序,可以按照以下步骤操作: 打开Visual Studio。 选择“文件”->“新建”->“项目”。 在“新建项…

    C# 2023年5月15日
    00
  • C#实例化和静态类对象调用对比

    下面是针对“C#实例化和静态类对象调用对比”的完整攻略。 一、实例化对象调用方法 在C#中,我们可以创建一个类的实例,从而调用该类的方法或访问该类的属性。实例化对象可以通过new关键字创建,具体代码如下: MyClass obj = new MyClass(); // 创建MyClass类的实例,存储在obj变量中 obj.MyMethod(); // 调用…

    C# 2023年6月1日
    00
  • C# networkcomms 3.0实现模拟登陆总结

    我来为您详细讲解“C#networkcomms3.0实现模拟登陆总结”的完整攻略。 一、背景介绍 在网络应用开发中,模拟登陆是经常需要用到的技能。本文将介绍如何使用C#及networkcomms3.0实现模拟登陆。 二、实现过程 1. 引入相关库 首先需要在项目中引入NetworkCommsDotNet库,可以通过nuget进行引入。 Install-Pac…

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