C#实现策略模式
1. 简介
策略模式(Strategy Pattern)是面向对象设计中的一种行为型模式,它允许在运行时动态地选择算法的行为。该模式将不同算法封装成独立的策略类,使得它们之间可以互相替换,从而实现不同的行为。
2. 示例场景
假设我们正在开发一个商场收银系统,在该系统中,我们需要根据不同顾客的会员等级以及购买的商品来计算最终的支付金额。而我们可以使用策略模式来实现这个功能。
2.1 定义接口
首先,我们可以定义一个接口,该接口中包含一个计算支付金额的方法。
public interface IPaymentStrategy
{
decimal Calculate(decimal amount);
}
在上述代码中,我们定义了一个名为IPaymentStrategy的接口,其中包含一个名为Calculate的方法,该方法接受一个decimal类型的参数amount,用于计算最终的支付金额。
2.2 实现具体策略
接下来,我们可以实现不同的具体策略类,每个策略类都实现了IPaymentStrategy接口,并根据自己的逻辑来计算支付金额。
public class NormalPaymentStrategy : IPaymentStrategy
{
public decimal Calculate(decimal amount)
{
return amount;
}
}
public class SilverMemberPaymentStrategy : IPaymentStrategy
{
public decimal Calculate(decimal amount)
{
return amount * 0.9m;
}
}
public class GoldMemberPaymentStrategy : IPaymentStrategy
{
public decimal Calculate(decimal amount)
{
return amount * 0.8m;
}
}
在上述代码中,我们分别定义了三个具体策略类:NormalPaymentStrategy(普通会员支付策略)、SilverMemberPaymentStrategy(银牌会员支付策略)和GoldMemberPaymentStrategy(金牌会员支付策略)。每个策略类都实现了IPaymentStrategy接口,并根据自己的会员等级来计算最终的支付金额。
2.3 使用策略
接下来,我们可以创建一个支付器类(PaymentProcessor),该类中包含一个IPaymentStrategy类型的字段,用于保存当前的支付策略。
public class PaymentProcessor
{
private IPaymentStrategy paymentStrategy;
public void SetPaymentStrategy(IPaymentStrategy strategy)
{
this.paymentStrategy = strategy;
}
public decimal CalculatePayment(decimal amount)
{
return paymentStrategy.Calculate(amount);
}
}
在上述代码中,PaymentProcessor类中的SetPaymentStrategy方法用于设置当前的支付策略,CalculatePayment方法用于根据当前的策略计算最终的支付金额。
现在,我们可以在实际使用的时候根据不同的场景选择不同的策略进行计算。
// 创建支付器实例
PaymentProcessor processor = new PaymentProcessor();
// 设置支付策略为普通会员支付策略
processor.SetPaymentStrategy(new NormalPaymentStrategy());
decimal amount = 1000.00m;
// 根据当前的支付策略计算支付金额
decimal paymentAmount = processor.CalculatePayment(amount);
Console.WriteLine("支付金额为:" + paymentAmount);
上述代码中,我们首先创建了一个PaymentProcessor实例,然后通过SetPaymentStrategy方法设置当前的支付策略为NormalPaymentStrategy(普通会员支付策略),最后使用CalculatePayment方法计算出最终的支付金额。
3. 总结
策略模式是一种非常灵活和易于扩展的设计模式,在实际开发中经常用于解耦具体的算法实现和调用方。通过引入策略模式,我们可以在运行时动态地选择算法的实现,从而实现不同行为的切换。在本文中,我们以一个商场收银系统的示例来介绍了C#中如何实现策略模式,希望读者能够通过本文对策略模式有更深入的理解。