在.NET环境下运用策略模式(Strategy Pattern)是一种常用的设计模式,它允许你定义一系列的算法,把它们一个个封装起来,并使它们可相互替换。此模式让算法的变化独立于使用算法的客户。
以下是一个简单的策略模式示例,假设我们有一个根据不同的折扣策略计算商品价格的场景:
### 1. 定义策略接口
首先,定义一个策略接口,该接口声明了算法的共同接口。
public interface IDiscountStrategy
{
decimal CalculateDiscount(decimal originalPrice);
}
### 2. 实现具体的策略
接着,创建实现了上述接口的具体策略类。
public class FixedDiscountStrategy : IDiscountStrategy
{
private decimal _discountAmount;
public FixedDiscountStrategy(decimal discountAmount)
{
_discountAmount = discountAmount;
}
public decimal CalculateDiscount(decimal originalPrice)
{
return _discountAmount;
}
}
public class PercentageDiscountStrategy : IDiscountStrategy
{
private decimal _discountPercentage;
public PercentageDiscountStrategy(decimal discountPercentage)
{
_discountPercentage = discountPercentage;
}
public decimal CalculateDiscount(decimal originalPrice)
{
return originalPrice * (_discountPercentage / 100);
}
}
### 3. 上下文类
上下文类(Context)用来维护对策略对象的引用。这个类含有一个客户感兴趣的接口,通常是对策略对象的引用。
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
private IDiscountStrategy _discountStrategy;
public Product(string name, decimal price, IDiscountStrategy discountStrategy)
{
Name = name;
Price = price;
_discountStrategy = discountStrategy;
}
public decimal GetDiscountedPrice()
{
decimal discount = _discountStrategy.CalculateDiscount(Price);
return Price - discount;
}
// 可以添加一个方法来设置不同的折扣策略
public void SetDiscountStrategy(IDiscountStrategy discountStrategy)
{
_discountStrategy = discountStrategy;
}
}
### 4. 客户端代码
最后,客户端代码可以根据需要选择合适的策略,并设置到上下文(这里是`Product`类)中。
class Program
{
static void Main(string[] args)
{
Product product = new Product("Laptop", 1000, new FixedDiscountStrategy(50));
Console.WriteLine($"Discounted Price: {product.GetDiscountedPrice()}");
// 更改折扣策略
product.SetDiscountStrategy(new PercentageDiscountStrategy(10));
Console.WriteLine($"Discounted Price with Percentage: {product.GetDiscountedPrice()}");
}
}
这个示例展示了如何使用策略模式在.NET环境中根据不同的折扣策略来计算商品的价格。通过定义策略接口和具体的策略实现,我们可以轻松地在不修改上下文类代码的情况下添加新的策略,提高了代码的灵活性和可扩展性。