【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. ...
随机推荐
- 如何在ChemDraw中打出符号π
很多人日常使用ChemDraw是一款非常优秀的化学绘图软件,在其绘制化学结构式或者反应式的过程中,常常需要添加各种符号.比如有的用户会需要输入希腊字符π,但是不知道用什么方法添加.本教程就来给大家介绍 ...
- 如何在ChemDraw中输入℃温度符号
化学反应常常对于温度是有一定要求的,所以用ChemDraw化学绘图工具在绘制化学反应的时候常常会用到℃温度符号.但是一些才接触ChemDraw的用户朋友不知道怎么输入℃.针对这种情况本教程来给大家分享 ...
- React + Redux 入门(一):抛开 React 学 Redux
http://www.hacke2.cn/think-in-react-redux-1/
- centos6.6-6.8的cobbler的kickstarts文件
author:headsen chendate: 2018-07-10 19:14:39 1,普通的mbr版的kickstarts的配置文件: [root@cobbler-server ~]# cat ...
- chkcofnig-minimal-script
author :headsen chen date: 2018-06-04 12:02:27 #!/bin/bash for i in `chkconfig --list |awk '{print ...
- 【POJ1275】Cashier Employment 差分约束
[POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...
- kafka基础概念
kafka介绍 kafka is a distributed, partitiononed,replicated commited logservice. kafka是一个分布式的.易扩展的.安全性高 ...
- react 快速 点击
用 fastclick npm 一下 他 就可以
- python学习笔记(二)— 集合
s = set()#建立空的集合 s2 = {'}#没有:的为集合,集合天生去重 s3 = {'} #集合是也是无序的 # s2.add('a')#添加值 # s2.remove('2')#删除值 # ...
- Yii框架2.0 数据库操作初接触
Yii2.0和Yii1.1版本的变动还是挺多的,我发现配置文件有许多不同,Yii1.1版本里有个main.php 好多信息是在这里配置的,比如默认控制器,数据库连接信息:Yii的数据库配置被单独拿出来 ...