【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. ...
随机推荐
- 使用cordova+Ionic+AngularJs进行Hybird App开发的环境搭建手冊
一.所需工具 1,JDK:生成 2.安卓SDK开发环境 3,NodeJs:主要使用的还是npm 4,Python开发环境 5.VS 2012(2008,2015也能够,已亲測):安装这个主要是须要一些 ...
- OSG addEventHandler W键显示网格 L键控制光照 F键切换全屏窗口 S键显示统计数据 事件处理器
#include <osgGA/StateSetManipulator> #include <osgViewer/ViewerEventHandlers> // add the ...
- tableview直接滚动至最后一行
类似聊天界面,tableview应该直接显示在最后一行,并且不应该有滚动的出现. 在网上查了很久,直接滚动至最后一行很容易实现,有两种方法比较好. 1. 调用scrollToRowAtIndexPat ...
- 总结界面框架_UI_Adapter
本人定期更新经典案例及解决方案如有疑问请联系我QQ1822282728 -- 277627117 下面是常用到的ui Demo 安卓三级筛选菜单listview(非常经典) http://dow ...
- 多线程sshd爆破程序代码
不多说了,直接上手代码,也没有啥练手的,都是很熟悉的代码,水一篇,方便作为工作的小工具吧.试了一下,配合一个好点的字典,还是可以作为个人小工具使用的. #!/usr/bin/env python # ...
- Fragment、FragmentTabHost以及RadioGroup框架
package com.dotfive.chuanbang.activity; import test.Fragment1; import test.Fragment1.OnBackListener; ...
- json、jsonp的定义和区别
一.区别 简单来说,json是一种数据交换格式,jsonp是一种非官方跨域数据交互协议.json描述的是信息的格式,而jsonp是信息传递双方约定的方法.json返回的是一串数据,而 jsonp返回的 ...
- 新浪博客:html+css+原生JS+Ajax初级+mySql数据库——源码
**************************************************************************************************** ...
- SignalR 循序渐进(四) Hub的生命周期以及IoC
有阵子没更新这个系列了,最近太忙了.本篇带来的是Hub的生命周期以及IoC. 首先,Hub的生命周期,我们用一个Demo来看看: public class TestHub : Hub { public ...
- linux下安装mysql-5.7.25
1.下载对应安装包 https://dev.mysql.com/downloads/mysql/ 2.卸载旧版本mysql 列出旧版本MySql的组件列表 rpm -qa | grep mysql ...