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# Stream.CopyTo – 复制流

    Stream.CopyTo 方法是C#中用于从当前流复制到目标流的一个方法。该方法可以被任何派生自Stream的对象调用。 该方法的具体作用是将数据从当前流中复制到指定的另一个流。通过该方法,可以将当前流中的数据直接复制到磁盘、网络套接字或其他流中。 具体使用方法如下: 语法 public void CopyTo(Stream destination); 该…

    C# 2023年4月19日
    00
  • .Net笔记:System.IO之Stream的使用详解

    .Net笔记: System.IO之Stream的使用详解 Stream的概念 Stream是System.IO命名空间下一个抽象类,它提供了一种用于读和写编码数据的通用视图。它可以作为抽象类来实现更特定类型的流,如FileStream或MemoryStream。 Stream的特性 下面是Stream的一些主要特性: Stream可以是只读、可写或可读写的…

    C# 2023年6月7日
    00
  • WPF开发之实现一种三轴机械手控件

    WPF开发之实现一种三轴机械手控件,涉及到的技术栈有WPF、XAML、C#等。下面按照步骤来介绍实现这种控件的攻略。 一、设计控件的外观 首先我们需要考虑机械手控件的外观设计,我们可以使用WPF提供的绘图功能,来绘制出控件的外观,比如:机械臂的手臂、手掌、手指等。 在WPF开发中,我们设计控件的外观采用的是XAML,XAML是一种基于XML的标记语言,可以在…

    C# 2023年6月6日
    00
  • C#图形编程GDI+基础介绍

    C#图形编程GDI+基础介绍 什么是GDI+? GDI+ (Graphics Device Interface) 是一套应用程序接口 (API),可以让程序员利用计算机的图形显示资源来创建和操作图形对象。在C#中,GDI+是一个用于图形绘制的本机API,可以让你通过编程轻松地操作Windows界面上的各种图形和文本,例如,画图、截图、缩放、亮度调节、色彩调节…

    C# 2023年5月31日
    00
  • C#实现Stream与byte[]之间的转换实例教程

    开始之前,我们需要了解两个概念:Stream 和 byte[]。 Stream 代表一个抽象的、可以被任意类型的数据读取和写入的流。它是一种序列化数据的方式,把不同的数据类型都转化成字节流。 在 C# 中,常用的 Stream 类有 FileStream、MemoryStream、NetworkStream 等。 而 byte[](字节数组)则是一组按照连续…

    C# 2023年6月7日
    00
  • C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

    C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信 简介 Protocol Buffer(又称protobuf)是Google开发的一种数据序列化格式,它比XML和JSON更快、更小、更简单。由于最初是用于Google内部的系统和数据通信,并且其生成和解析代码性能优秀,因此被开源出来,可供广泛的应用使用。 Unity…

    C# 2023年6月3日
    00
  • C#通过不安全代码看内存加载的示例详解

    让我来给大家详细讲解一下“C#通过不安全代码看内存加载的示例详解”的完整攻略。 标题 在开始之前,我们需要给这篇攻略一个标准的标题。根据通常的写作规范,一个良好的标题应该简洁、直观、准确地表达文章的主要内容。因此,我们可以采用如下的格式来给这篇攻略取一个合适的标题: C#通过不安全代码看内存加载的示例详解 内容 在正式讲解之前,我们需要了解一下什么是不安全代…

    C# 2023年5月15日
    00
  • 如何将asp.net core程序部署到Linux服务器

    可以的。详细讲解“如何将ASP.NET Core程序部署到Linux服务器”的完整攻略如下: 1. 准备工作 在开始之前,需要准备以下工作: 一台安装了Linux操作系统的服务器。 Linux服务器上安装了.NET Core运行环境,可以使用dotnet –info命令来检查是否已经安装。 一个ASP.NET Core应用程序。 2. 发布应用程序 在将A…

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