您的位置:首页 > 产品设计 > UI/UE

【java】使用Builder模式,轻松应对动态繁杂的方法参数

2015-09-02 14:16 776 查看
背景:在咱编写的图片处理模块里,针对加载这个方法,参数很多,如:

/**
* 加载图片,经过内存、磁盘、两层缓存如果还没找到,则走http访问网络资源
* @param url 地址
* @param imageView 图片控件
* @param width 图片宽度
* @param height 图片高度
* @param cacheType 缓存类型
* @param workType 队列优先级
* @param placeHolder 占位图片
* @param canQueryHttp 是否可以走流量获取图片
*/
private void load(String url, ImageView imageView, int width, int height, CacheType cacheType, ImageTaskManager.WorkType workType, int placeHolder, boolean canQueryHttp) {

}


咱们当然可以用 重载 提供很多个版本,应付项目里面的需要。

但是我们可以用Builder(构造器)模式,提供一种更加优雅易用的访问方式。

事实上,很多android上优秀的开源图片框架都用了这种方式,如picassouniversalImageLoader

先给上优化后,咱们调用加载方法的方式:

ZImage.ready().want(entity.getIconUrl()).reSize(mImgSize, mImgSize).into(newsIcon);


全部的参数如下:

ZImage.ready().want("请求地址").reSize(图片尺寸).cache(缓存方式).canQueryByHttp(是否可以走流量访问图片).lowPriority(将请求放到栈的底部).empty(图片占位符).into(图片控件);


接下来简单说下,咱是如何简单用构造器模式重构图片功能模块的:

1:新建一个类RequestCreator, 将load方法的参数抽取出来作为其属性

2:针对每个属性的赋值方法,返回this,这样就可以保证每次赋值后,可以获得对象继续赋值

/**
* 缓存
*
* @param cacheType 缓存类型
* @return
*/
public RequestCreator cache(CacheType cacheType) {
this.cacheType = cacheType;
return this;
}


3:增加一个方法,将类里面的属性,作为参数传递到load方法里

/**
* 载入图片到控件
*
* @param imageView
*/
public void into(ImageView imageView) {
mZImage.load(url, imageView, width, height, cacheType, priority, placeHolder, canQueryByHttp);
}


4:在现有图片功能类里面,添加一个want方法,返回RequestCreator。

/**
* 构造器起手式,从一个资源开始
*
* @param url
* @return
*/
public RequestCreator want(String url) {
return new RequestCreator(url);
}




给上完整的构造器的类,各位可以参考下,完整的图片模块请参考本人的项目源码

/**
* 请求构造器
*/
public class RequestCreator {
/**
* 请求地址
*/
String url;

/**
* 优先级,默认后进先出
*/
ImageTaskManager.WorkType priority = ImageTaskManager.WorkType.LIFO;

/**
* 占位图
*/
int placeHolder = -1;

/**
* 缓存类型,默认内存缓存,基于LRU算法,不用担心内存爆炸
*/
CacheType cacheType = CacheType.DiskMemory;

/**
* 图片的宽度
*/
int width = mBaseApp.getScreenWidth();

/**
* 图片的高度
*/
int height = mBaseApp.getScreenHeight();

/**
* 能否通过http请求网络数据
*/
boolean canQueryByHttp = true;

public RequestCreator(String url) {
this.url = url;
this.canQueryByHttp = mBaseApp.canRequestImage();
}

/**
* 占位图
*
* @param resID 本地图片资源 R.drawable.
* @return
*/
public RequestCreator empty(int resID) {
placeHolder = resID;
return this;
}

/**
* 缓存
*
* @param cacheType 缓存类型
* @return
*/
public RequestCreator cache(CacheType cacheType) {
this.cacheType = cacheType;
return this;
}

/**
* 优先级,默认后进先出。使用本方法降低优先级
*
* @return
*/
public RequestCreator lowPriority() {
priority = ImageTaskManager.WorkType.LILO;
return this;
}

/**
* 对图片尺寸进行缩放,节约内存
*
* @param width  图片宽度,默认屏幕宽度
* @param height 图片高度,默认屏幕高度
* @return
*/
public RequestCreator reSize(int width, int height) {
this.width = width;
this.height = height;
return this;
}

public RequestCreator canQueryByHttp(boolean canQueryByHttp) {
this.canQueryByHttp = canQueryByHttp;
return this;
}

/**
* 载入图片到控件
*
* @param imageView
*/
public void into(ImageView imageView) {
mZImage.load(url, imageView, width, height, cacheType, priority, placeHolder, canQueryByHttp);
}

/**
* 下载图片
*/
public void save() {
if (DBHelper.cache().exist(url))
return;

ImageTaskManager.getInstance().addTask(new SaveImageTask(mBaseApp, url, width, height), priority);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: