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

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

类别:行为型设计模式

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

典型场景

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

压缩算法:

  1. jpeg格式
  2. png格式

滤镜:

  1. blackAndWhite滤镜
  2. backgroundBlur滤镜

硬编码

public class HardCode {    public static void main(String[] args) {        var fileName = "test.webp";        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.webp";        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/
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部