最近剛好遇到一個問題 是在於圖片的套件要升級版本的問題
最近剛好遇到一個問題 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就可以快速的換掉使用圖片的地方達到容易維護的目的