当需要在运行时动态切换多种算法且不修改客户端代码时,策略模式(Strategy Pattern)能完美解决问题。在.NET Core中,这种行为型设计模式通过定义算法族、封装算法并使其可互换来实现灵活性。
典型应用场景:
核心优势:
• 封装性:隔离不同策略的实现
• 开闭原则:新增策略无需修改既有代码
• 解耦设计:降低算法间的依赖
• 易测试性:各策略可独立测试
步骤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)}");
}
}
通过本教程,我们掌握了: