最近剛好遇到一個問題 是在於圖片的套件要升級版本的問題
最近剛好遇到一個問題 Android 的圖片常用套件"Glide"要升級套件的問題,在"程式設計人應該知道的 97 件事"書中 慎選工具的這一篇提到 "用介面和分層,將外部工具和業務領域物件分離" 必須得讓我的程式跟工具有分層,這樣子我才能用極少的代價去替換它。
所以剛好遇到升級套件的問題,而構想了這樣子的設計
package com.example.tim_wu.myapplication.util;
import android.widget.ImageView;
public class ImageLoader implements IImageLoader {
private static ImageLoader ourInstance;
private IImageLoader mImageLoader;
private ImageLoader() {
mImageLoader = new GlideImageLoader();
}
public static ImageLoader getInstance() {
if (null == ourInstance) {
ourInstance = new ImageLoader();
}
return ourInstance;
}
@Override
public void loadImage(String url, ImageView target) {
mImageLoader.loadImage(url, target);
}
@Override
public void loadImage(String url, int placeholder, ImageView target) {
mImageLoader.loadImage(url, placeholder, target);
}
@Override
public void loadImageWithCenterCrop(String url, int placeholder, ImageView target) {
mImageLoader.loadImageWithCenterCrop(url, placeholder, target);
}
}
第一段程式碼是我們的主要ImageLoader,設計成 Singleton 讓使用的地方可以直接使用。
package com.example.tim_wu.myapplication.util;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
public class GlideImageLoader implements IImageLoader {
@Override
public void loadImage(String url, ImageView target) {
Glide.with(target.getContext()).load(url).into(target);
}
@Override
public void loadImage(String url, int placeholder, ImageView target) {
Glide.with(target.getContext()).load(url).placeholder(placeholder).into(target);
}
@Override
public void loadImageWithCenterCrop(String url, int placeholder, ImageView target) {
Glide.with(target.getContext()).load(url).centerCrop()
.placeholder(placeholder).into(target);
}
}
第二段程式是主要實作Glide這個套件的地方 其實只要在這邊去實作Glide就好了, 外部不用特別知道裡面是如何實作的 只需要將Url and ImageView帶進來就好
package com.example.tim_wu.myapplication.util;
import android.widget.ImageView;
public interface IImageLoader {
void loadImage(String url, ImageView target);
void loadImage(String url, int placeholder, ImageView target);
void loadImageWithCenterCrop(String url, int placeholder, ImageView target);
}
第三段程式碼其實是我定義loadImage的行為 在後續要新增的時候 可以直接在這邊新增
雖然範例中是以Glide為例子但是難保好幾年後是不是又有更新的圖片套件出來,所以後面的人維護時只需要更換ImageLoader就可以快速的換掉使用圖片的地方達到容易維護的目的