【问题标题】:design pattern: how to add optional params for methods?设计模式:如何为方法添加可选参数?
【发布时间】:2022-01-22 15:00:55
【问题描述】:

我有一个实用程序类:

public class ImageCompressionUtil {

  public static void compressor(InputStream image, OutputStream outputStream, double quality,
      String outputFormat) throws IOException {
    Thumbnails.of(image).scale(1).outputQuality(quality).outputFormat(outputFormat).
        toOutputStream(outputStream);
  }

  public static void compressor(byte[] image, OutputStream outputStream, double quality,
      String outputFormat) throws IOException {
    ByteArrayInputStream inputStream = new ByteArrayInputStream(image);
    Thumbnails.of(inputStream).scale(1).outputQuality(quality).
        outputFormat(outputFormat).toOutputStream(outputStream);
  }

  public static byte[] compressor(InputStream image, double quality, String outputFormat)
      throws IOException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    Thumbnails.of(image).scale(1).outputQuality(quality).
        outputFormat(outputFormat).toOutputStream(outputStream);
    return outputStream.toByteArray();
  }

  public static byte[] compressor(byte[] image, double quality, String outputFormat) throws IOException {
    ByteArrayInputStream inputStream = new ByteArrayInputStream(image);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    Thumbnails.of(inputStream).scale(1).outputQuality(quality).
        outputFormat(outputFormat).toOutputStream(outputStream);
    return outputStream.toByteArray();
  }
}

在这些方法中,我们可以看到一些重复的参数,例如outputStream,quality,outputFormat。 如何重写这个类,以便我可以像这样的模式使用这个类:

// no outputstream/quality/outputFormat specified, default values are used;
ImageCompressionUtil.compressor(image);

// specifiy outputstream or quality or outputFormat
ImageCompressionUtil.compressor(image, outputstream);
ImageCompressionUtil.compressor(image).quality(quality);
ImageCompressionUtil.compressor(image).outputFormat(outputFormat);

// both quality and outputFormat are specified
ImageCompressionUtil.compressor(image).quality(quality).outputFormat(outputFormat);

...

【问题讨论】:

  • 在我看来像个建设者。
  • 是的,看起来需要 Builder 模式,因为 Java 既不支持命名参数也不支持默认参数(我没有深入研究您的方法,但通常将重载从一个分配到另一个可能比将相同的代码复制到多个地方要好)。欢迎来到 Java 世界...
  • 你可以使用builder模式

标签: java design-patterns


【解决方案1】:

是的:它看起来像构建器模式。

您只需要两个 compressor 方法,它们将返回 Compressor 类(构建器)的实例:

public class ImageCompressionUtil {
    public Compressor compressor(InputStream image) {
        return new Compressor(image);
    }

    public Compressor compressor(byte[] image) {
        return new Compressor(new ByteArrayInputStream(image));
    }
}

Compressor 类如下所示:

public class Compressor {
    private final Thumbnail thumbnail;

    public Compressor(InputStream image) {
        this.thumbnail = Thumbnail.of(image).scale(1);
    }

    public Compressor quality(double quality) {
        thumbnail.outputQuality(quality);
        return this;
    }

    public Compressor outputFormat(String format) {
        thumbnail.outputFormat(format);
        return this;
    }

    public void writeTo(OutputStream outputStream) {
        thumbnail.toOutputStream(outputStream);
    }

    public byte[] toBytes() {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        writeTo(out);
        return out.toByteArray();
    }
}

因此,您将首先创建一个压缩器,然后设置参数,然后将结果写入 OutputStream 或将其作为字节数组获取。

不清楚的是哪个类应该关闭InputStream

请注意Compressor 类与我所说的Thumbnail 类(由Thumbnails.of() 返回的内容)并没有太大区别,您可以直接返回Thumbnails.of(image).scale(1) 的结果而不是创建另一个类.

【讨论】:

  • 它的构建器加上流畅的界面模式。 Builder不一定要求流利;它可以使用普通的设置器。
  • @Bohemian 好的,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 2013-03-25
相关资源
最近更新 更多