策略设计模式:动态切换算法的艺术(C#实现)

作者:微信公众号:【架构师老卢】
6-7 9:11
13

策略设计模式是一种行为型设计模式,它允许在运行时从算法族中选择特定算法。通过将算法单独封装并使其可互换,该模式能帮助我们创建灵活、可复用的代码,而无需修改现有代码结构。

无策略模式时的问题

若不使用策略模式,我们通常需要依赖条件语句(if-else或switch-case)来决定使用哪种算法或方法。这种方式会导致:

  • 代码重复:在代码库的不同位置出现多重条件判断
  • 维护困难:添加新策略需要修改现有代码
  • 违反开闭原则:每次引入新算法都需要修改类
  • 缺乏可复用性:算法与使用它们的类紧密耦合

无策略模式的示例

using System;

public class PaymentService
{
    public void ProcessPayment(string paymentType)
    {
        if (paymentType == "CreditCard")
        {
            Console.WriteLine("Processing payment via Credit Card");
        }
        else if (paymentType == "PayPal")
        {
            Console.WriteLine("Processing payment via PayPal");
        }
        else if (paymentType == "Crypto")
        {
            Console.WriteLine("Processing payment via Cryptocurrency");
        }
        else
        {
            Console.WriteLine("Invalid payment method");
        }
    }
}
class Program
{
    static void Main()
    {
        PaymentService paymentService = new PaymentService();
        paymentService.ProcessPayment("CreditCard");
    }
}

上述代码的问题

  1. 添加新支付方式需要修改ProcessPayment方法
  2. 类与支付处理逻辑紧密耦合
  3. 难以单独测试每种支付方式

C#实现策略模式

为解决这些问题,我们可以使用策略模式重构代码。

第一步:定义策略接口

创建支付策略接口:

public interface IPaymentStrategy
{
    void ProcessPayment();
}

第二步:实现具体策略

每个支付方法都作为独立的类实现IPaymentStrategy接口:

public class CreditCardPayment : IPaymentStrategy
{
    public void ProcessPayment()
    {
        Console.WriteLine("Processing payment via Credit Card");
    }
}

public class PayPalPayment : IPaymentStrategy
{
    public void ProcessPayment()
    {
        Console.WriteLine("Processing payment via PayPal");
    }
}

public class CryptoPayment : IPaymentStrategy
{
    public void ProcessPayment()
    {
        Console.WriteLine("Processing payment via Cryptocurrency");
    }
}

第三步:创建上下文类

上下文类持有策略引用并委托执行:

public class PaymentContext
{
    private IPaymentStrategy _paymentStrategy;

    public PaymentContext(IPaymentStrategy paymentStrategy)
    {
        _paymentStrategy = paymentStrategy;
    }

    public void ProcessPayment()
    {
        _paymentStrategy.ProcessPayment();
    }
}

第四步:在主程序中使用策略模式

class Program
{
    static void Main()
    {
        IPaymentStrategy paymentMethod = new PayPalPayment();
        PaymentContext paymentContext = new PaymentContext(paymentMethod);
        paymentContext.ProcessPayment();
    }
}

策略模式的现实应用

  • 支付处理系统:不同支付网关(信用卡、PayPal、加密货币等)
  • 排序算法:动态选择不同排序技术
  • 压缩库:应用不同压缩算法(ZIP、GZIP、RAR等)
  • 认证策略:支持不同认证机制(OAuth、JWT、SAML等)
  • 日志框架:允许不同日志策略(文件日志、控制台日志、数据库日志等)

策略模式的优点

遵循开闭原则:无需修改现有代码即可添加新策略
提高代码复用性:不同支付策略可重复使用
增强可维护性:支付逻辑与PaymentContext类分离
便于单元测试:每个策略可独立测试

策略模式的缺点

增加复杂性:需要更多类
对象创建开销:需要创建策略类的新实例
不适用于简单场景:若只有2-3种策略,简单的switch-case可能就足够

何时使用策略模式?

  • 当你有多个相关算法且需要动态切换时
  • 当你想消除复杂的条件语句时
  • 当你想将算法逻辑与主业务逻辑分离时
  • 当你需要提高代码的可维护性和可测试性时

策略模式是动态处理多种算法的有效方式,能显著提升代码组织性和灵活性。虽然它增加了一定的复杂性,但极大地增强了可维护性,是处理需要多种可互换行为的系统时的理想选择。

相关留言评论
昵称:
邮箱:
阅读排行