前言
圖片加載在我們平時的項目開發(fā)當(dāng)中經(jīng)常會用到,為了可以更好的在項目當(dāng)中復(fù)用圖片加載功能,把它封裝成一個通用的庫是很有必要的。
使用

ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(url).isCircle(true).imageView(imageViewOne).build());
ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(urlTwo).isGray(true).imageView(imageViewTwo).build());
ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(urlThree).imageHeight(1400).imageWidth(1600).imageView(imageViewThree).build());
三個請求分別實現(xiàn)三張圖片的效果,第一張圖片是圓角,第一張是圖片變灰,第三張是設(shè)置圖片顯示的寬高
實現(xiàn)
主要由三個類組成
//圖片代理類
ImageLoadProxy
//圖片參數(shù)配置類
ImageLoadConfiguration
//圖片加載接口類
ImageLoad
首先來看看ImageLoadProxy類
public class ImageLoadProxy {
private static ImageLoadProxy mInstance;
private ImageLoad mImageLoad;
public static ImageLoadProxy getInstance() {
if (mInstance == null) {
synchronized (ImageLoadProxy.class) {
if (mInstance == null) {
mInstance = new ImageLoadProxy();
}
}
}
return mInstance;
}
private ImageLoadProxy() {
mImageLoad = new GlideImageLoad();
}
public void load(ImageLoadConfiguration imageLoadCfg) {
mImageLoad.load(imageLoadCfg);
}
ImageLoadProxy使用了單例模式,有個全局屬性ImageLoad,ImageLoad是個接口,它的實例對象是在構(gòu)造方法當(dāng)中實現(xiàn)的
public ImageLoadProxy() {
mImageLoad = new GlideImageLoad();
}
ImageLoad接口有個load方法,接口的實現(xiàn)類GlideImageLoad會重寫load方法來加載圖片,ImageLoadProxy的load方法內(nèi)部就是調(diào)用了ImageLoad的load方法,我們來看看實現(xiàn)類GlideImageLoad
public class GlideImageLoad implements ImageLoad {
@Override
public void load(ImageLoadConfiguration imageLoadCfg) {
GlideManager.load(imageLoadCfg);
}
}
GlideManager.load(imageLoadCfg) 就是通過Glide庫加載圖片
ImageLoadProxy的load方法有個ImageLoadConfiguration參數(shù),我們來看看ImageLoadConfiguration類
public class ImageLoadConfiguration {
public final Context context;
public final ImageView imageView;
public final String url;
public final int defaultImageResId;
public final boolean isCircle;
public final boolean isGray;
public final int imageWidth;
public final int imageHeight;
public ImageLoadConfiguration(Builder builder) {
context = builder.context;
imageView = builder.imageView;
url = builder.url;
defaultImageResId = builder.defaultImageResId;
isCircle = builder.isCircle;
isGray = builder.isGray;
imageWidth = builder.imageWidth;
imageHeight = builder.imageHeight;
}
public static final class Builder {
private Context context;
private ImageView imageView;
private String url;
private int defaultImageResId;
private boolean isCircle;
private boolean isGray;
private int imageWidth;
private int imageHeight;
public Builder(Context context) {
this.context = context;
}
public Builder url(String url) {
this.url = url;
return this;
}
public Builder defaultImageResId(int defaultImageResId) {
this.defaultImageResId = defaultImageResId;
return this;
}
public Builder isCircle(boolean isCircle) {
this.isCircle = isCircle;
return this;
}
public Builder isGray(boolean isGray) {
this.isGray = isGray;
return this;
}
public Builder imageWidth(int imageWidth) {
this.imageWidth = imageWidth;
return this;
}
public Builder imageHeight(int imageHeight) {
this.imageHeight = imageHeight;
return this;
}
public Builder imageView(ImageView imageView) {
this.imageView = imageView;
return this;
}
public ImageLoadConfiguration build() {
return new ImageLoadConfiguration(this);
}
}
ImageLoadConfiguration使用了Builder模式,可以自由的去組裝不同的屬性,然后根據(jù)屬性值來實現(xiàn)圖片加載的不同效果(實現(xiàn)模塊的三個不同的調(diào)用就是案例)。
結(jié)束語
供業(yè)務(wù)層調(diào)用的ImageLoadProxy類是個代理類,它并沒有去做加載圖片的功能,而是使用ImageLoad接口的實現(xiàn)類來加載圖片,這樣做的好處是如果以后要使用其他開源庫去加載圖片,可以重新創(chuàng)建一個ImageLoad接口的實現(xiàn)類來加載圖片,符合設(shè)計模式的開閉原則。
ImageLoadProxy,ImageLoad,ImageLoadConfiguration 三個類各司其職,
ImageLoadConfiguration 負(fù)責(zé)參數(shù)的配置,
ImageLoad 負(fù)責(zé)圖片的加載,
ImageLoadProxy 負(fù)責(zé)調(diào)度
符合設(shè)計模式的單一職責(zé)原則,各自負(fù)責(zé)各自的功能
具體代碼實現(xiàn) https://github.com/chenpengfei88/ImageLoad