【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. ...
随机推荐
- Angular 表单(二) - 模板驱动表单
import { Component, OnInit } from '@angular/core'; import { Hero} from '../hero'; @Component({ selec ...
- .NET开发过程中的全文索引使用技巧之Solr
前言:相信许多人都听说过.net开发过程中基于Lucene.net实现的全文索引,而Solr是一个高性能,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查 ...
- 《C++ Primer Plus》学习笔记 2.1.3 C++预处理器和iostream文件
程序清单2-1 myfirst.cpp // myfirst.cpp -- displays a message #include <iostream> // a PREPROCESSOR ...
- 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼 矩阵乘法
[BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...
- How to install sharepoint server 2010 sp2 in window 7 x64
1. 下载 sharepoint server 2010 sp2 x64 2. 下载 前置环境插件 Microsoft FilterPack 2.0 (CD "C:\Program Fil ...
- kafka "HelloWorld"实践
前面我们分别介绍了kafka的相关基本原理,kafka的集群服务器搭建以及kafka相关的配置,本文综合前面的理论知识,运用kafka Java API实现一个简单的客户端Demo. 开发环境 操作系 ...
- Divisibility by Eight---cf550C(被8整除 暴力)
题目链接:http://codeforces.com/problemset/problem/550/C 题意是给你一个不操过100位的数,问删除m位之后,问剩下的数不改变顺序能被8整除的数存在不存在: ...
- shell基础知识总结
1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...
- golang http.ResponseWriter valid json
golang httpserver如果采用 fmt.Fprintf(w, result)来输出json数据时,若json数据包含%号,则会出现问题. 输出结果里面会包含(MISSING)字样, ...
- windbg遍历进程页表查看内存
2016-12-09 近期想查看下系统分配了的页的页表项的标志位,但是发现资料较少,所以还是记录下,希望可以对某些朋友有所帮助! 系统:win7 32位虚拟机 平台:KVM虚拟化平台 win7 32位 ...