項(xiàng)目開發(fā)時(shí),一般都會(huì)有圖片加載搁宾、地圖等需求折汞,而這些一般使用第三方庫(kù),例如圖片加載可能會(huì)選擇Glide盖腿、Picasso爽待、Fresco等其中的一種,地圖可供選擇的有百度地圖翩腐、高德地圖鸟款、華為地圖(即將發(fā)布),那么怎樣將其集成到項(xiàng)目中呢茂卦?直接將相關(guān)的功能加入到業(yè)務(wù)邏輯中嗎何什?那么突然有一天要將現(xiàn)有使用換成另一種呢?例如現(xiàn)在圖片加載使用的是Glide框架等龙,突然要換成Fresco处渣,此時(shí)怎么辦?要吭哧吭哧再將相關(guān)邏輯再寫一遍嗎而咆?
當(dāng)然不能霍比,因?yàn)檫@不符合程序員“懶”的特質(zhì)幕袱,那怎么辦暴备?好,那借此機(jī)會(huì)啰嗦一下面向?qū)ο螅∣OP)設(shè)計(jì)原則:
基于以上原則们豌,來封裝引入第三方服務(wù)涯捻,以圖片加載為例:
- 首先基于依賴倒置原則使用接口實(shí)現(xiàn)圖片加載的邏輯:
public interface ILoader {
void load(Context context, ImageView imageView, @DrawableRes int drawableRes);
void load(Context context, ImageView imageView, String url);
void load(Context context, ImageView imageView, byte[] image);
void load(Context context, ImageView imageView, @DrawableRes int drawableRes, @DrawableRes int errorResId, @DrawableRes int placeholderResId);
void load(Context context, ImageView imageView, String url, @DrawableRes int errorResId, @DrawableRes int placeholderResId);
void load(Context context, ImageView imageView, byte[] image, @DrawableRes int errorResId, @DrawableRes int placeholderResId);
}
- 具體實(shí)現(xiàn)由其子類完成:
public class GlideLoader implements ILoader {
@Override
public void load(Context context, ImageView imageView, int drawableRes) {
Glide.with(context)
.load(drawableRes)
.into(imageView);
}
@Override
public void load(Context context, ImageView imageView, String url) {
Glide.with(context)
.load(url)
.into(imageView);
}
@Override
public void load(Context context, ImageView imageView, byte[] image) {
Glide.with(context)
.load(image)
.into(imageView);
}
@Override
public void load(Context context, ImageView imageView, int drawableRes, int errorResId, int placeholderResId) {
Glide.with(context)
.load(drawableRes)
.apply(getRequestOptions(errorResId, placeholderResId))
.into(imageView);
}
@Override
public void load(Context context, ImageView imageView, String url, int errorResId, int placeholderResId) {
Glide.with(context)
.load(url)
.apply(getRequestOptions(errorResId, placeholderResId))
.into(imageView);
}
@Override
public void load(Context context, ImageView imageView, byte[] image, int errorResId, int placeholderResId) {
Glide.with(context)
.load(image)
.apply(getRequestOptions(errorResId, placeholderResId))
.into(imageView);
}
}
- 然后統(tǒng)一使用Manager管理:
public class ImageLoader implements ILoader {
private ILoader mImageLoader;
private static ImageLoader imageManager;
private ImageLoader() {
}
public static ImageLoader getInstance() {
if (imageManager == null) {
synchronized (ImageLoader.class) {
if (imageManager == null) {
imageManager = new ImageLoader();
}
}
}
return imageManager;
}
public void setImageLoader(ILoader imageLoader) {
mImageLoader = imageLoader;
}
@Override
public void load(Context context, ImageView imageView, int drawableRes) {
mImageLoader.load(context, imageView, drawableRes);
}
@Override
public void load(Context context, ImageView imageView, String url) {
mImageLoader.load(context, imageView, url);
}
@Override
public void load(Context context, ImageView imageView, byte[] image) {
mImageLoader.load(context, imageView, image);
}
@Override
public void load(Context context, ImageView imageView, int drawableRes, int errorResId, int placeholderResId) {
mImageLoader.load(context, imageView, drawableRes, errorResId, placeholderResId);
}
@Override
public void load(Context context, ImageView imageView, String url, int errorResId, int placeholderResId) {
mImageLoader.load(context, imageView, url, errorResId, placeholderResId);
}
@Override
public void load(Context context, ImageView imageView, byte[] image, int errorResId, int placeholderResId) {
mImageLoader.load(context, imageView, image, errorResId, placeholderResId);
}
}
- 使用時(shí)先設(shè)置setImageLoader()浅妆,然后通過ImageLoader直接調(diào)用:
//在Application中設(shè)置
private void setImageLoader() {
ImageLoader.getInstance().setImageLoader(new GlideLoader());
}
- 全局使用,例如:
@Override
protected void initView() {
super.initView();
ImageLoader.getInstance().load(getContext(), mImgMainActImg, R.mipmap.ic_launcher_round);
}
6.突然技術(shù)改變要更換成Picasso障癌,那么直接實(shí)現(xiàn)PicassoLoader凌外,設(shè)置 ImageLoader.getInstance().setImageLoader(new PicassoLoader())即可,原有邏輯一下也不需要?jiǎng)?/p>
備注:Fresco加載圖片使用的是自定義View控件加載圖片涛浙,所以以上ImageView修改為View更佳
回過頭來分析下康辑,此圖片加載框架封裝幾乎使用了上述所有的設(shè)計(jì)原則,也可推廣到地圖和其他轿亮,讀者有不同觀點(diǎn)或改進(jìn)建議請(qǐng)留言一起交流一下疮薇!