设计模式:如何为方法添加可选参数?

Posted

技术标签:

【中文标题】设计模式:如何为方法添加可选参数?【英文标题】: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模式 【参考方案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 好的,谢谢。

以上是关于设计模式:如何为方法添加可选参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何为带有可选 URL 参数的 GET 请求映射不同的 JSON 响应

如何为多种产品设计产品表,其中每种产品都有很多参数

[小技巧]C#中如何为枚举类型添加描述方法

如何为函数参数“*argv”添加解析器参数

如何为我的 iOS 应用程序集成维护模式

您如何为 DSpace 创建一个新的、可搜索的元数据模式?