簡體   English   中英

設計模式:如何為方法添加可選參數?

[英]design pattern: how to add optional params for methods?

我有一個實用程序 class:

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();
  }
}

在這些方法中,我們可以看到一些重復的參數,如outputStreamqualityoutputFormat 如何重寫這個 class 以便我可以像這樣的模式使用這個 class :

// 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);

...

是的:它看起來像建造者模式。

您只需要兩個將返回Compressor class (構建器)實例的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 class 看起來像這樣:

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或將其作為字節數組獲取。

不清楚的一件事是哪個 class 應該關閉InputStream

請注意, Compressor class 與我所說的Thumbnail class (由Thumbnails.of()返回的內容)沒有太大區別,您可以直接返回Thumbnails.of(image).scale(1)的結果而不是創建另一個 class。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM