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

yizhihongxing

首先我们来介绍一下“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日

相关文章

  • .NET1.0版本中的异步编程模型(APM)

    .NET 1.0版本中的异步编程模型(APM) 在 .NET 1.0 版本中,使用异步编程模型(Async Programming Model,APM)可以轻松实现异步操作,其主要思想是通过非阻塞式编程模型来提高程序性能和响应时间。通过将耗时操作放入单独的线程中,并在处理完成后通知调用线程,提高了程序并发性和响应时间。 异步编程模型的基本组成部分 异步编程模…

    C# 2023年6月3日
    00
  • C# 常量 结构体 委托

    常量 const double PI = 3.1415926; 常量名命名一般使用大写字母 枚举类型 开发一个游戏,游戏角色有法师(Mage)、射手(Archer)、刺客(Assassin)、坦克(Tank)、铺助(Support)、战士(Warrior),等不同类型。 ❓如何存储游戏角色 使用int类型 :创建一套规则,提前为各个类型角色绑定一个数字标识 …

    C# 2023年5月6日
    00
  • 实例代码讲解c# 线程(下)

    让我来详细讲解一下“实例代码讲解c# 线程(下)”的完整攻略。 1. 标题说明 本篇文章主要是针对C#线程相关知识进行讲解,并通过实例的方式来进行代码演示,包含线程同步、线程异步、线程池等内容。 2. 线程同步 线程同步是指多个线程在操作共享资源时,需要通过某种机制来保证数据的正确性。在C#中,常用的同步机制有锁机制和Monitor机制。 2.1 锁机制 p…

    C# 2023年5月31日
    00
  • ajax调用中ie缓存问题解决方法

    在Ajax调用中,IE浏览器可能会缓存先前的响应,导致无法获取最新的数据。本文将提供解决IE缓存问题的完整攻略,包括问题原因、解决方案和示例。 问题原因 当使用Ajax调用从服务器获取数据时,IE浏览器可能会缓存先前的响应。这是因为IE浏览器默认情况下会缓存GET请求的响应,以提高性能。但是,如果响应数据经常更改,就需要获取最新的数据,而不是缓存的数据。 解…

    C# 2023年5月15日
    00
  • 部署ASP.NET Core程序到Linux系统

    部署ASP.NET Core程序到Linux系统攻略 ASP.NET Core是一个跨平台的Web应用程序框架,可以在Windows、Linux和macOS等操作系统上运行。本文将介绍如何将ASP.NET Core程序部署到Linux系统上。 准备工作 在开始之前,需要完成以下准备工作: 安装.NET Core SDK。 安装Linux系统。 步骤 步骤1:…

    C# 2023年5月17日
    00
  • C#实现的几种委托方式介绍

    下面是“C#实现的几种委托方式介绍”的完整攻略。 1. 委托的概念 委托(Delegate)是一种类型,它定义了一个方法(或一组方法)的参数类型和返回值类型。委托可以看做是函数的“指针”,它允许我们将方法作为参数传递,并且可以通过委托调用传递的方法。 2. 委托的定义 在 C# 中,委托定义的格式如下: delegate 返回类型 委托名称(参数类型 参数名…

    C# 2023年6月7日
    00
  • C#常用字符串加密解密方法封装代码

    非常感谢您对C#常用字符串加密解密方法封装代码的关注。下面为您详细介绍如何实现该功能。 1. 基本概念 在介绍具体的代码实现之前,首先需要了解一些基本概念。 1.1 加密和解密 加密是指将原始的明文数据通过一定的算法转换为密文,以达到防止信息泄露的目的;而解密则是指将密文数据还原回原始的明文数据。 1.2 对称加密和非对称加密 对称加密是指加密和解密使用同一…

    C# 2023年6月7日
    00
  • visual studio 2019使用net core3.0创建winform无法使用窗体设计器

    Visual Studio 2019使用.NET Core 3.0创建WinForm无法使用窗体设计器攻略 在本攻略中,我们将详细讲解如何在Visual Studio 2019中使用.NET Core 3.0创建WinForm应用程序,并解决无法使用窗体设计器的问题。我们将提供两个示例说明。 步骤一:安装.NET Core 3.0 SDK 在Visual S…

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