1/24 设计模式之策略设计模式 Strategy Pattern

940 阅读2分钟

类别:行为型设计模式

目的:把同类的代码进行单独封装、使得需要使用这部分代码的用户可以按需使用

典型场景

对用户上传的图片应用不同的压缩算法和滤镜

压缩算法:

  1. jpeg格式
  2. png格式

滤镜:

  1. blackAndWhite滤镜
  2. backgroundBlur滤镜

硬编码

public class HardCode {
    public static void main(String[] args) {
        var fileName = "test.jpg";
        var compressor = "jpeg";
        var filter = "blackAndWhite";

        handleUpload(fileName, compressor, filter);
    }

    public static void handleUpload(String fileName, String compressor, String filter)
    {
        if (compressor.equals("jpeg")) {
            System.out.println("应用jpeg压缩算法...");
        } else if (compressor.equals("png")) {
            System.out.println("应用png压缩算法...");
        }

        if (filter.equals("blackAndWhite")) {
            System.out.println("应用blackAndWhite滤镜");
        } else if (filter.equals("backgroundBlur")) {
            System.out.println("应用blackAndBlur滤镜");
        }
    }
}

模式实现

代码

按照代码类别定义接口

上面的代码分成两类,一类是压缩算法,另一类是滤镜算法

压缩算法接口

public interface Compressor {
  void apply(String fileName);
}

2个压缩算法的具体实现

public class JpegCompressor implements Compressor {
  @Override
  public void apply(String fileName) {
      System.out.println("应用jpeg压缩算法...");
  }
}

public class PngCompressor implements Compressor {
  @Override
  public void apply(String fileName) {
      System.out.println("应用png压缩算法...");
  }
}

滤镜算法

public interface Filter {
  void apply(String fileName);
}

2个滤镜算法的具体实现

public class BlackAndWhiteFilter implements Filter {
  @Override
  public void apply(String fileName) {
      System.out.println("应用blackAndWhite滤镜");
  }
}

public class BackgroundBlurFilter implements Filter {
    @Override
    public void apply(String fileName) {
        System.out.println("应用backgroundBur滤镜");
    }
}

使用策略

    public static void main(String[] args) {
        var fileName = "test.jpg";
        var compressor = new JpegCompressor();
        var filter = new BlackAndWhiteFilter();

        handleUpload(fileName, compressor, filter);
    }

    public static void handleUpload(String fileName, Compressor compressor, Filter filter) {
        compressor.apply(fileName);

        filter.apply(fileName);
    }

UML

为什么策略模式更好

可以看到这里个策略模式把具体的算法实现单独抽离到独立的类中了,调用方流程更加清晰,同时,单独的具体算法实现类也更容易被复用

一些注意的点

每个策略的具体实现可以很复杂,通过封装,使得这部分复杂的代码保持了独立

策略对象由用户进行创建并传递到处理方法中: handleUpload(String fileName, Compressor compressor, Filter filter)

参考资料

  1. java-design-patterns.com/patterns/st…
  2. docs.staruml.io/