策略模式与委托实战指南:用C#实现动态税务计算系统

作者:微信公众号:【架构师老卢】
3-15 15:48
30

本教程将掌握两大核心技能:C#中的策略模式委托,并通过实战案例演示实时应用方法。


策略模式解析

当需要在运行时动态切换多种算法且不修改客户端代码时,策略模式(Strategy Pattern)能完美解决问题。在.NET Core中,这种行为型设计模式通过定义算法族、封装算法并使其可互换来实现灵活性。

典型应用场景

  1. 按需税务计算:根据国家/地区动态切换税率规则
  2. 灵活排序算法:根据需求切换快速排序、归并排序等算法

核心优势
封装性:隔离不同策略的实现
开闭原则:新增策略无需修改既有代码
解耦设计:降低算法间的依赖
易测试性:各策略可独立测试


基础实现:无委托的税务计算系统

步骤1:定义税率计算逻辑接口与实现

public interface ITaxStrategy  
{  
    decimal CalculateTax(decimal amount);  
}  

public class USTax : ITaxStrategy  
{  
    public decimal CalculateTax(decimal amount) => amount * 0.07m; // 7%税率  
}  

public class UKTax : ITaxStrategy  
{  
    public decimal CalculateTax(decimal amount) => amount * 0.2m; // 20%增值税  
}  

步骤2:创建策略调度中心类

public class TaxApply  
{  
    private ITaxStrategy _taxStrategy;  

    public void SetTaxStrategy(ITaxStrategy strategy) => _taxStrategy = strategy;  

    public decimal CalculateTax(decimal amount) => _taxStrategy.CalculateTax(amount);  
}  

步骤3:运行时动态注入策略

// appsettings.json  
{  
  "TaxSettings": {  
    "Country": "US"  // 可动态切换为"UK"或"India"  
  }  
}  

class Program  
{  
    static void Main()  
    {  
        var config = new ConfigurationBuilder()  
            .AddJsonFile("appsettings.json")  
            .Build();  

        string country = config["TaxSettings:Country"];  

        var taxApply = new TaxApply();  

        if(country == "US")  
        {  
            taxApply.SetTaxStrategy(new USTax());  
            Console.WriteLine($"US Tax: {taxApply.CalculateTax(100)}");  
        }  

        if(country == "UK")  
        {  
            taxApply.SetTaxStrategy(new UKTax());  
            Console.WriteLine($"UK Tax: {taxApply.CalculateTax(100)}");  
        }  
    }  
}  

进阶实现:委托驱动的动态税务系统

步骤1:定义税率计算类

public class USTax  
{  
    public decimal Calculate(decimal amount) => amount * 0.07m;  
}  

public class UKTax  
{  
    public decimal Calculate(decimal amount) => amount * 0.2m;  
}  

public class IndiaTax  
{  
    public decimal Calculate(decimal amount) => amount * 0.18m;  
}  

步骤2:声明委托类型

public delegate decimal TaxStrategy(decimal amount);  

步骤3:构建委托调度中心

public class TaxApply  
{  
    private TaxStrategy _taxStrategy;  

    public void SetTaxStrategy(TaxStrategy strategy) => _taxStrategy = strategy;  

    public decimal ExecuteTaxCalculation(decimal amount) => _taxStrategy?.Invoke(amount) ?? 0;  
}  

步骤4:动态策略注入实战

class Program  
{  
    static void Main()  
    {  
        var config = new ConfigurationBuilder()  
            .AddJsonFile("appsettings.json")  
            .Build();  

        string country = config["TaxSettings:Country"];  
        decimal amount = 1000m;  

        var taxApply = new TaxApply();  

        switch(country.ToUpper())  
        {  
            case "US":  
                taxApply.SetTaxStrategy(new USTax().Calculate);  
                break;  
            case "UK":  
                taxApply.SetTaxStrategy(new UKTax().Calculate);  
                break;  
            case "INDIA":  
                taxApply.SetTaxStrategy(new IndiaTax().Calculate);  
                break;  
            default:  
                Console.WriteLine("无效国家配置");  
                return;  
        }  

        Console.WriteLine($"{country}税额: {taxApply.ExecuteTaxCalculation(amount)}");  
    }  
}  

极简委托实现方案

class Program  
{  
    public delegate decimal TaxStrategy(decimal amount);  

    static decimal USTax(decimal amount) => amount * 0.07m;  
    static decimal UKTax(decimal amount) => amount * 0.2m;  
    static decimal IndiaTax(decimal amount) => amount * 0.18m;  

    static void Main()  
    {  
        TaxStrategy taxMethod = USTax;  
        Console.WriteLine($"美国税额: {taxMethod(1000)}");  

        taxMethod = UKTax;  
        Console.WriteLine($"英国税额: {taxMethod(1000)}");  
    }  
}  

通过本教程,我们掌握了:

  1. 策略模式在动态算法切换中的实战应用
  2. 委托机制如何简化策略模式的实现
  3. 配置驱动的运行时策略注入技巧
  4. 两种实现方案的优劣对比(接口 vs 委托)
相关留言评论
昵称:
邮箱:
阅读排行