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#中命名参数和可选参数

    C#中的命名参数和可选参数可以方便地在方法调用中设置参数的值,从而提高代码的可读性和灵活性。下面是详细的攻略说明。 命名参数 命名参数允许在方法调用时,通过指定参数名的方式来传递参数,而不必考虑参数的顺序。这样可以使得代码更加易读和易维护。 定义一个方法并使用命名参数的示例代码如下: public void PrintInfo(string name, in…

    C# 2023年6月1日
    00
  • 详析C#的协变和逆变

    详析C#的协变和逆变 在C#中,协变和逆变是非常重要的概念,尤其是在泛型的使用中更是如此。本文将详细讲解C#的协变和逆变。 协变 协变是一种安全的类型转换,从一个更特殊的类型转换为一个更一般的类型,也就是说,从子类型转换为父类型。在C#中,协变只支持泛型接口或泛型委托。使用out关键字可以指示泛型类型参数是协变的。以下代码示例展示了协变的用法: interf…

    C# 2023年5月15日
    00
  • C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法

    C#中一般使用递归方式实现二叉树的遍历。常见的三种二叉树遍历方式是前序遍历、中序遍历和后序遍历。下面就详细介绍C#在实现这三种遍历方式时需要注意的问题和实现方法。 前序遍历 前序遍历是按照根节点、左子树、右子树的顺序遍历二叉树。例如给定二叉树如下: 1 / \ 2 3 前序遍历输出结果为:1 2 3 C#代码实现如下: public void PreOrde…

    C# 2023年6月8日
    00
  • asp.net文件上传带进度条实现案例(多种风格)

    针对“asp.net文件上传带进度条实现案例(多种风格)”这个话题,以下是一个完整的攻略。 1. 背景介绍 在很多web应用程序中,都需要用户上传文件的功能。而对于大文件或者网络不稳定的情况下,上传进度条的需求就非常迫切了。要满足这个需求,可以使用一些第三方的插件或者框架,比如jQuery-File-Upload或者FineUploader等。但这些插件或者…

    C# 2023年6月1日
    00
  • c#调用存储过程实现登录界面详解

    让我来为你详细解释一下“C# 调用存储过程实现登录界面”的攻略。 什么是存储过程? 存储过程是一组 SQL 语句的集合,它们执行某些指定任务。存储过程通常是为了完成特定的任务而设计的,比如:插入、更新、删除数据等等。存储过程可以在数据库中创建并保存,供其他程序或者脚本调用执行。 如何调用存储过程实现登录界面? 下面给出具体的步骤: 步骤一:创建一个存储过程 …

    C# 2023年5月31日
    00
  • WPF自动隐藏的消息框的实例代码

    WPF自动隐藏的消息框是一种常见的用户界面元素,它可以在应用程序中显示消息或警告,并在一定时间后自动隐藏。本文将介绍如何创建WPF自动隐藏的消息框,并提供两个示例来演示如何使用这些技术。 创建WPF自动隐藏的消息框 以下是创建WPF自动隐藏的消息框的步骤: 创建一个新的WPF窗口,用于显示消息框。 在窗口中添加一个TextBlock控件,用于显示消息文本。 …

    C# 2023年5月15日
    00
  • 从ASP.NET Core3.1迁移到5.0的方法

    从 ASP.NET Core 3.1 迁移到 5.0 可以带来更好的性能、更好的开发体验和更多的新功能。以下是从 ASP.NET Core 3.1 迁移到 5.0 的完整攻略: 步骤一:备份项目 在进行迁移前,需要备份 ASP.NET Core 3.1 项目。可以将项目文件复制到另一个目录或者使用版本控制系统来备份项目。 步骤二:更新 .NET Core S…

    C# 2023年5月17日
    00
  • C# IsReadOnly:获取一个值,该值指示集合是否为只读

    C#中的IsReadOnly属性用于指示集合或数组是否为只读。如果集合或数组为只读,则不允许用户添加、修改或删除其元素。IsReadOnly是一个bool类型的属性,其值默认为false。当IsReadOnly为true时,集合或数组将变为只读状态,任何修改都会引发NotSupportedException异常。 以下是IsReadOnly属性用法的示例: …

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