策略设计模式是一种行为型设计模式,它允许在运行时从算法族中选择特定算法。通过将算法单独封装并使其可互换,该模式能帮助我们创建灵活、可复用的代码,而无需修改现有代码结构。
若不使用策略模式,我们通常需要依赖条件语句(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");
}
}
为解决这些问题,我们可以使用策略模式重构代码。
创建支付策略接口:
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();
}
}
✅ 遵循开闭原则:无需修改现有代码即可添加新策略
✅ 提高代码复用性:不同支付策略可重复使用
✅ 增强可维护性:支付逻辑与PaymentContext类分离
✅ 便于单元测试:每个策略可独立测试
❌ 增加复杂性:需要更多类
❌ 对象创建开销:需要创建策略类的新实例
❌ 不适用于简单场景:若只有2-3种策略,简单的switch-case可能就足够
策略模式是动态处理多种算法的有效方式,能显著提升代码组织性和灵活性。虽然它增加了一定的复杂性,但极大地增强了可维护性,是处理需要多种可互换行为的系统时的理想选择。