Skip to content

策略模式(Strategy Pattern)

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用,使得算法的变化可以独立于使用它们的客户端。策略模式通常用于需要在运行时根据情况选择算法的场景。

关键点

  1. 策略(Strategy):定义所有支持的算法的公共接口。通常是一个接口或抽象类。
  2. 具体策略(Concrete Strategy):实现了策略接口的具体算法实现。
  3. 环境(Context):维护一个对策略对象的引用,可以通过策略接口调用具体的算法。

示例

假设我们有一个图像处理应用程序,根据用户的需求可以选择不同的图片滤镜处理图像。我们可以使用策略模式来实现不同的滤镜算法,并且在运行时动态选择和切换滤镜。

1. 定义策略接口和具体策略类

csharp
// 策略接口
public interface IFilterStrategy
{
    void ApplyFilter(string fileName);
}

// 具体策略类 - 黑白滤镜
public class BlackAndWhiteFilter : IFilterStrategy
{
    public void ApplyFilter(string fileName)
    {
        Console.WriteLine($"Applying Black and White filter to {fileName}");
        // 实现黑白滤镜的具体逻辑
    }
}

// 具体策略类 - 高斯模糊滤镜
public class GaussianBlurFilter : IFilterStrategy
{
    public void ApplyFilter(string fileName)
    {
        Console.WriteLine($"Applying Gaussian Blur filter to {fileName}");
        // 实现高斯模糊滤镜的具体逻辑
    }
}

// 具体策略类 - 色彩增强滤镜
public class ColorEnhancementFilter : IFilterStrategy
{
    public void ApplyFilter(string fileName)
    {
        Console.WriteLine($"Applying Color Enhancement filter to {fileName}");
        // 实现色彩增强滤镜的具体逻辑
    }
}

2. 定义环境类

csharp
// 环境类
public class ImageProcessor
{
    private IFilterStrategy filterStrategy;

    // 设置策略
    public void SetFilterStrategy(IFilterStrategy strategy)
    {
        filterStrategy = strategy;
    }

    // 应用策略
    public void ApplyFilter(string fileName)
    {
        filterStrategy.ApplyFilter(fileName);
    }
}

3. 客户端代码

csharp
class Program
{
    static void Main(string[] args)
    {
        ImageProcessor processor = new ImageProcessor();

        // 使用黑白滤镜
        processor.SetFilterStrategy(new BlackAndWhiteFilter());
        processor.ApplyFilter("photo1.jpg");

        // 使用高斯模糊滤镜
        processor.SetFilterStrategy(new GaussianBlurFilter());
        processor.ApplyFilter("photo2.jpg");

        // 使用色彩增强滤镜
        processor.SetFilterStrategy(new ColorEnhancementFilter());
        processor.ApplyFilter("photo3.jpg");
    }
}

解释

  1. 策略接口(IFilterStrategy):定义了所有具体策略类必须实现的方法 ApplyFilter
  2. 具体策略类:分别实现了不同的滤镜算法,每个类负责实现自己的滤镜逻辑。
  3. 环境类(ImageProcessor):维护一个对策略对象的引用,客户端可以在运行时设置和切换具体的策略。

优点

  • 灵活性:可以在运行时动态切换算法。
  • 可维护性:策略模式将每个算法封装在独立的类中,易于单独修改和测试。
  • 避免多重条件语句:通过策略模式可以避免复杂的条件语句,提高代码的可读性和可维护性。

缺点

  • 客户端必须了解所有的策略类:客户端需要知道所有可用的策略类,并且需要选择合适的策略。

适用场景

  • 需要在不同时间应用不同的算法:例如排序算法、图像处理中的滤镜、文件压缩算法等。
  • 需要避免使用条件语句实现不同行为:例如大量的 if-else 语句可以使用策略模式优化。

示例的现实应用

策略模式在许多现实应用中都有应用:

  • 排序算法:例如在排序算法中选择不同的排序策略,如快速排序、冒泡排序等。
  • 支付系统:例如支付方式选择,可以有不同的支付策略。
  • 游戏开发:例如角色的移动策略、攻击策略等。

通过使用策略模式,可以使得算法的变化独立于使用它们的客户端,提高代码的灵活性和可维护性。