C#实现策略模式

下面是关于" C#实现策略模式" 的详细讲解:

策略模式

策略模式是一种行为设计模式,它使您能够定义一系列算法,将它们封装在各自的类中,然后使它们可以相互替换。策略使算法独立于使用它的客户端,因此可以单独更改。

实现步骤

根据策略模式的思路,我们可以把一个算法分成两个部分,一部分是公共接口,用于申明所有算法的行为,另一部分是具体实现策略。具体实现算法的部分统一实现一个公共接口。

1. 定义接口

我们先定义一个接口,用于实现所有算法的公共行为:

public interface ITaxCalculator
{
    decimal Calculate(decimal salary);
}

2. 实现策略

实现对应算法的类,实现上面的接口:

public class USATaxCalculator : ITaxCalculator
{
    public decimal Calculate(decimal salary)
    {
        return salary * 0.3m;
    }
}

public class ChinaTaxCalculator : ITaxCalculator
{
    public decimal Calculate(decimal salary)
    {
        return salary * 0.1m;
    }
}

3. 使用策略

使用时,我们可以根据不同的具体算法,实例化对应的策略,并使用其公共行为:

public class Program
{
    static void Main(string[] args)
    {
        var salary = 5000m;
        ITaxCalculator calculator = new ChinaTaxCalculator();
        var tax = calculator.Calculate(salary);
        Console.WriteLine($"The tax in China is {tax}.");

        calculator = new USATaxCalculator();
        tax = calculator.Calculate(salary);
        Console.WriteLine($"The tax in USA is {tax}.");
    }
}

运行上面的程序,输出:

The tax in China is 500.
The tax in USA  is 1500.

示例1

对于计算器程序,针对不同的计算方式,可以采用策略模式,比如上面我们实现的美国和中国的TaxCalculator,我们可以在计算器程序中提供不同的策略,让用户自行选择不同的计算税率方法。

如果代码采用策略模式,遵循“开放-封闭” 原则,支持添加新的策略而无需影响现有代码,保证了代码的可维护性。

示例2

考虑一个依赖一些实现了一个抽象评估器的工作流。现在需要在不同的评估器之间切换。可以通过使用策略模式来完成此操作:

public class Workflow
{
    private readonly IEvaluator _evaluator;

    public Workflow(IEvaluator evaluator)
    {
        _evaluator = evaluator;
    }

    public void Process()
    {
        Console.WriteLine("Start processing...");
        var result = _evaluator.Evaluate();
        Console.WriteLine($"Result = {result}");
        Console.WriteLine("Finish processing.");
    }
}

public interface IEvaluator
{
    int Evaluate();
}

public class AddEvaluator : IEvaluator
{
    private readonly int _x;
    private readonly int _y;

    public AddEvaluator(int x, int y)
    {
        _x = x;
        _y = y;
    }

    public int Evaluate()
    {
        Console.WriteLine($"Calculating {_x} + {_y}");
        return _x + _y;
    }
}

public class MultiplyEvaluator : IEvaluator
{
    private readonly int _x;
    private readonly int _y;

    public MultiplyEvaluator(int x, int y)
    {
        _x = x;
        _y = y;
    }

    public int Evaluate()
    {
        Console.WriteLine($"Calculating {_x} * {_y}");
        return _x * _y;
    }
}

现在,可以像这样调用“Workflow”类:

var add = new AddEvaluator(1, 2);
var multiply = new MultiplyEvaluator(3, 4);

var workflow = new Workflow(add);
workflow.Process();

workflow = new Workflow(multiply);
workflow.Process();

运行结果如下:

Start processing...
Calculating 1 + 2
Result = 3
Finish processing.
Start processing...
Calculating 3 * 4
Result = 12
Finish processing.

这样,我们就通过策略模式实现了一系列算法,并将它们封装在各自的类中,使它们可以相互替换,同时也使算法独立于使用它的客户端,因此可以方便地添加,修改和维护不同的算法。

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

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

相关文章

  • C#实现下拉框绑定list集合的方法

    下面是详细讲解“C#实现下拉框绑定list集合的方法”的完整攻略。 1. 准备工作 在实现下拉框绑定list集合之前,需要先准备好以下几个工作: 安装 Visual Studio 开发工具(建议使用最新版本) 创建一个 C# 项目 导入 System.Collections.Generic 命名空间,使用 List 泛型集合 2. 绑定List集合到下拉框 …

    C# 2023年5月31日
    00
  • C# .NET创建虚拟目录的方法详解

    C# .NET创建虚拟目录的方法详解 当我们需要在 IIS 中创建虚拟目录时,可以利用 C# .NET 中的 Microsoft.Web.Administration 命名空间来实现。该命名空间提供了访问 IIS 的 API,可以通过代码创建、删除和修改虚拟目录等功能。 步骤一:添加引用 在开始之前,需要添加 Microsoft.Web.Administra…

    C# 2023年6月3日
    00
  • .Net Core服务治理Consul自动扩展和服务调用

    在 .NET Core 中,Consul 是一种服务发现和配置工具,可以帮助我们实现服务治理。以下是 .NET Core 服务治理 Consul 自动扩展和服务调用的完整攻略: 步骤一:安装 Consul 首先,需要安装 Consul。可以从官网下载 Consul 安装包,也可以使用 Docker 安装。以下是一个使用 Docker 安装 Consul 的示…

    C# 2023年5月17日
    00
  • C#使用泛型队列Queue实现生产消费模式

    一、概述 生产消费模式是一种常用的多线程编程模型,生产者不断向队列中添加任务,消费者从队列中取出任务进行处理。生产者和消费者在不同的线程中运行,通过队列实现线程之间的协作。在 C# 中,可以使用泛型队列 Queue 来实现生产消费模式。本文将详细介绍如何使用 C# 中的泛型队列 Queue 实现生产消费模式。 二、生产消费模式实现步骤 创建泛型队列 Queu…

    C# 2023年6月7日
    00
  • 深入DropDownList用法的一些学习总结分析

    深入DropDownList用法的一些学习总结分析 DropDownList是ASP.NET Web Forms中最基本的控件之一,用于在网页中展现一组供用户选择的选项,典型的应用场景包括年龄、性别、地区等数据集合的选择。本文将介绍DropDownList的详细用法,包括数据绑定、选项操作、事件处理等方面。 数据绑定 DropDownList最基本的使用方法…

    C# 2023年5月31日
    00
  • C# Directory.Delete(string path):删除指定目录

    C#中的Directory.Delete(string path)方法是用于删除指定路径下的目录及其所有子目录和文件。 具体用法如下: Directory.Delete(string path); 其中,path是要删除的目录路径。如果目录中有内容(包括子目录和文件),该方法将删除所有内容。 注意事项: 删除的目录必须存在,否则会引发DirectoryNot…

    C# 2023年4月19日
    00
  • 详解C# 利用反射根据类名创建类的实例对象

    详解C# 利用反射根据类名创建类的实例对象 在C#中,反射是一个重要的特性,可以让我们在运行时动态地加载和分析程序集。利用反射可以实现在运行时根据类名创建对象的目的。本篇文章将详细讲解利用反射根据类名创建类的实例对象的完整攻略。 步骤一:获取类型信息 使用反射创建实例对象的第一步是获取类型信息。在C#中,Type类表示一个类型的元数据。我们可以使用Type.…

    C# 2023年6月1日
    00
  • 深入Unix时间戳与C# DateTime时间类型互换的详解

    下面我将详细讲解“深入Unix时间戳与C# DateTime时间类型互换的详解”这一主题。 1. Unix时间戳 Unix时间戳是记录时间的一种方式,它指的是从1970年1月1日00:00:00以来经过的秒数。在Unix系统中,时间戳被广泛使用,它只表示时间大小,并不涉及时区等信息。 1.1 将Unix时间戳转换为C# DateTime类型 在C#中,我们可…

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