[英]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();
}
}
在這些方法中,我們可以看到一些重復的參數,如outputStream
、 quality
、 outputFormat
。 如何重寫這個 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.