將一個複雜對象的構建和它的表示分離,使得一樣的構建過程能夠建立不一樣的表示設計模式
public class ImageLoader {
//圖片加載配置
private int loadingImageId;
private int loadingFailImageId;
// 圖片緩存,依賴接口
ImageCache mImageCache = new MemoryCache();
// 線程池,線程數量爲CPU的數量
ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
//省略單例模式實現
/**
* 設置圖片緩存
* @param cache
*/
public void setImageCache(ImageCache cache) {
mImageCache = cache;
}
/**
* 設置圖片加載中顯示的圖片
* @param resId
*/
public Builder setLoadingPlaceholder(int resId) {
loadingImageId = resId;
}
/**
* 設置加載失敗顯示的圖片
* @param resId
*/
public Builder setLoadingFailPlaceholder(int resId) {
loadingFailImageId = resId;
}
/**
* 顯示圖片
* @param imageUrl
* @param imageView
*/
public void displayImage(String imageUrl, ImageView imageView) {
Bitmap bitmap = mImageCache.get(imageUrl);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
return;
}
// 圖片沒有緩存,提交到線程池下載
submitLoadRequest(imageUrl, imageView);
}
/**
* 下載圖片
* @param imageUrl
* @param imageView
*/
private void submitLoadRequest(final String imageUrl, final ImageView imageView) {
imageView.setImageResource(loadingImageId);
imageView.setTag(imageUrl);
mExecutorService.submit(new Runnable() {
@Override
public void run() {
Bitmap bitmap = downloadImage(imageUrl);
if (bitmap == null) {
imageView.setImageResource(loadingFailImageId);
return;
}
if (imageUrl.equals(imageView.getTag())) {
imageView.setImageBitmap(bitmap);
}
mImageCache.put(imageUrl, bitmap);
}
});
}
/**
* 下載圖片
* @param imageUrl
* @return
*/
private Bitmap downloadImage(String imageUrl) {
Bitmap bitmap = null;
//省略下載部分代碼
return bitmap;
}
}
複製代碼
從上面的代碼中咱們能夠看出,每當須要增長一個設置選項的時候,就須要修改ImageLoader的代碼,違背了開閉原則,並且ImageLoader中的代碼會愈來愈多,不利於維護緩存
public class ImageLoaderConfig {
// 圖片緩存,依賴接口
public ImageCache mImageCache = new MemoryCache();
//加載圖片時的loading和加載失敗的圖片配置對象
public DisplayConfig displayConfig = new DisplayConfig();
//線程數量,默認爲CPU數量+1;
public int threadCount = Runtime.getRuntime().availableProcessors() + 1;
private ImageLoaderConfig() {
}
/**
* 配置類的Builder
*/
public static class Builder {
// 圖片緩存,依賴接口
ImageCache mImageCache = new MemoryCache();
//加載圖片時的loading和加載失敗的圖片配置對象
DisplayConfig displayConfig = new DisplayConfig();
//線程數量,默認爲CPU數量+1;
int threadCount = Runtime.getRuntime().availableProcessors() + 1;
/**
* 設置線程數量
* @param count
* @return
*/
public Builder setThreadCount(int count) {
threadCount = Math.max(1, count);
return this;
}
/**
* 設置圖片緩存
* @param cache
* @return
*/
public Builder setImageCache(ImageCache cache) {
mImageCache = cache;
return this;
}
/**
* 設置圖片加載中顯示的圖片
* @param resId
* @return
*/
public Builder setLoadingPlaceholder(int resId) {
displayConfig.loadingImageId = resId;
return this;
}
/**
* 設置加載失敗顯示的圖片
* @param resId
* @return
*/
public Builder setLoadingFailPlaceholder(int resId) {
displayConfig.loadingFailImageId = resId;
return this;
}
void applyConfig(ImageLoaderConfig config) {
config.displayConfig = this.displayConfig;
config.mImageCache = this.mImageCache;
config.threadCount = this.threadCount;
}
/**
* 根據已經設置好的屬性建立配置對象
* @return
*/
public ImageLoaderConfig create() {
ImageLoaderConfig config = new ImageLoaderConfig();
applyConfig(config);
return config;
}
}
}
複製代碼
public class ImageLoader {
//圖片加載配置
ImageLoaderConfig mConfig;
// 圖片緩存,依賴接口
ImageCache mImageCache = new MemoryCache();
// 線程池,線程數量爲CPU的數量
ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
//省略單例模式實現
//初始化ImageLoader
public void init(ImageLoaderConfig config) {
mConfig = config;
mImageCache = mConfig.mImageCache;
}
/**
* 顯示圖片
* @param imageUrl
* @param imageView
*/
public void displayImage(String imageUrl, ImageView imageView) {
Bitmap bitmap = mImageCache.get(imageUrl);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
return;
}
// 圖片沒有緩存,提交到線程池下載
submitLoadRequest(imageUrl, imageView);
}
/**
* 下載圖片
* @param imageUrl
* @param imageView
*/
private void submitLoadRequest(final String imageUrl, final ImageView imageView) {
imageView.setImageResource(mConfig.displayConfig.loadingImageId);
imageView.setTag(imageUrl);
mExecutorService.submit(new Runnable() {
@Override
public void run() {
Bitmap bitmap = downloadImage(imageUrl);
if (bitmap == null) {
imageView.setImageResource(mConfig.displayConfig.loadingFailImageId);
return;
}
if (imageUrl.equals(imageView.getTag())) {
imageView.setImageBitmap(bitmap);
}
mImageCache.put(imageUrl, bitmap);
}
});
}
/**
* 下載圖片
* @param imageUrl
* @return
*/
private Bitmap downloadImage(String imageUrl) {
Bitmap bitmap = null;
//省略下載部分代碼
return bitmap;
}
}
複製代碼
ImageLoaderConfig config = new ImageLoaderConfig.Builder()
.setImageCache(new MemoryCache())
.setThreadCount(2)
.setLoadingFailPlaceholder(R.drawable.loading_fail)
.setLoadingPlaceholder(R.drawable.loading)
.create();
ImageLoader.getInstance().init(config);
複製代碼
歡迎掃碼關注公衆號,我們一塊兒學習成長吧 bash