【java】使用Builder模式,轻松应对动态繁杂的方法参数
背景:在咱编写的图片处理模块里,针对加载这个方法,参数很多,如:
/**
* 加载图片,经过内存、磁盘、两层缓存如果还没找到,则走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上优秀的开源图片框架都用了这种方式,如picasso,universalImageLoader等
先给上优化后,咱们调用加载方法的方式:
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);
}
}
【java】使用Builder模式,轻松应对动态繁杂的方法参数的更多相关文章
- Java之Builder模式(并用OC实现了这种模式)
本人在学习Java,直接先学习Netty框架,因为Netty框架是业界最流行的NIO框架之一,在学习的过程中,了解到Netty服务端启动需要先创建服务器启动辅助类ServerBootstrap,它提供 ...
- Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器-比lombok更符合需求
builder模式在越来越多的项目中使用,类似于alibaba fastjson JSONObject.fluentPut(),调用一个方法后返回这个对象本身,特别适合构建一些参数超级多的对象,代码优 ...
- java设计模式--Builder模式
一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的 ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Android(java)学习笔记141:SQLiteDatabase的query方法参数分析
public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] se ...
- Android(java)学习笔记84:SQLiteDatabase的query方法参数
1. SQLiteDatabase的query方法: public Cursor query (boolean distinct, String table, String[] columns, St ...
- effective java 3th item2:考虑 builder 模式,当构造器参数过多的时候
yiaz 读书笔记,翻译于 effective java 3th 英文版,可能有些地方有错误.欢迎指正. 静态工厂方法和构造器都有一个限制:当有许多参数的时候,它们不能很好的扩展. 比如试想下如下场景 ...
- 02.当构造参数过多时使用builder模式
前言 <Effective Java>中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看.其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文<给Java程序猿们 ...
- Java设计模式之builder模式
Java设计模式之builder模式 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的.再次整理一下什么是builder模式以及应用场景. 1. ...
随机推荐
- Margin外边距叠加
外边距(Margin)叠加 只有普通文档流中块级元素(块框)的垂直外边距才会发生外边距叠加.行内框.浮动框和绝对定位框之间的外边距不会叠加 两个相邻兄弟块框 父元素与子元素,并 父元素没有内边距或边框 ...
- vue2.0中,由于页面完成之后dom还未加载完成如何进行操作
再vue中,当页面加载完成以后,dom还没有加载,是无法获取进行操作的,但是在vue2.0中提供了一个方法:this.$nextTick,在这个回调函数里面写dom操作即可: 如下代码: create ...
- 【BZOJ4071】[Apio2015]巴邻旁之桥 Treap
[BZOJ4071][Apio2015]巴邻旁之桥 Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 ...
- 《从零开始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器
原创文章,欢迎转载.转载请注明:关东升的博客 实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法,示例代码如下: button.a ...
- android how to deal with data when listview refresh
如何解决listview数据刷新,下拉刷新,上拉加载更多时,图片不闪烁. 在Activity的onResume()方法中将adaper和listView重新再绑定一次. listView.setAda ...
- java中Logger.getLogger(Test.class),即log4日志的使用
log4的使用方法: log4是具有日志记录功能,主要通过一个配置文件来对程序进行监测有两种配置方式:一种程序配置,一种文件配置有三个主要单元要了解,Logger,appender,layout. l ...
- Array.prototype.filter(Boolean)
ES5 中的数组有这个方法:Array.prototype.filter ,具体使用参考MDN,这里讲一个特殊应用: 回顾下语法: new_array = arr.filter(callback[, ...
- 学习ASP.NET MVC3(6)----- Filte
前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码 ...
- [iOS微博项目 - 3.5] - 封装业务
github: https://github.com/hellovoidworld/HVWWeibo A.封装微博业务 1.需求 把微博相关业务(读取.写微博) 界面控制器不需要知道微博操作细节( ...
- Android中可自由移动悬浮窗口的实现
http://www.xsmile.net/?p=538 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的ad ...