.NET 下运用策略模式(组合行为和实体的一种模式)


在.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环境中根据不同的折扣策略来计算商品的价格。通过定义策略接口和具体的策略实现,我们可以轻松地在不修改上下文类代码的情况下添加新的策略,提高了代码的灵活性和可扩展性。