十一、构建者模式
构建者模式主要是用于创建复杂的一些对象,这些对象的创建步骤基本固定,但是可能具体的对象的组成部分却又可以自由的变化,比如房子装修,我可以在卧室里放电视,也可以不放电视,我还可以摆个电脑,这些属性可以自由变化。
要构建这样一个对象,就需要一个创建一个Builder,用于构建需要的对象。
import java.util.HashMap;
import java.util.Map;
/**
* 专门用于Http请求的类
* 设置请求参数,请求头
* 支持重试,默认重试3次
* @author Lynn
*
*/
public final class Request {
//专门用于存储请求参数
private Map<String,Object> params = new HashMap<String,Object>();
//专门用于存储请求头
private Map<String,Object> headers = new HashMap<String,Object>();
private int retry = 3;//重试次数(默认为3次)
private String url;//请求的url地址
private int timeout = 30 * 1000;//连接有效时间,默认为10s
private Method method = Method.GET;//请求方法,默认为get
public static class Builder{
//专门用于存储请求参数
private Map<String,Object> params = new HashMap<String,Object>();
//专门用于存储请求头
private Map<String,Object> headers = new HashMap<String,Object>();
private int retry = 3;//重试次数(默认为3次)
private String url;//请求的url地址
private int timeout = 30 * 1000;//连接有效时间,默认为30s
private Method method = Method.GET;//请求方法,默认为get
/**
* 添加请求参数
* @param key
* @param value
* @return
*/
public Builder addParameter(String key,Object value){
params.put(key, value);
return this;
}
/**
* 添加请求头
* @param key
* @param value
* @return
*/
public Builder addHeader(String key,Object value){
headers.put(key, value);
return this;
}
/**
* 设置重试次数(默认3次)
* @param retry
* @return
*/
public Builder setRetry(int retry){
this.retry = retry;
return this;
}
/**
* 设置url地址
* @param url
* @return
*/
public Builder setUrl(String url){
this.url = url;
return this;
}
/**
* 设置超时时间(默认30s)
* @param timeout
* @return
*/
public Builder setTimeout(int timeout){
this.timeout = timeout;
return this;
}
/**
* 设置请求方法(默认为GET)
* @param method
* @return
*/
public Builder setMethod(Method method){
this.method = method;
return this;
}
public Request build(){
return new Request(this);
}
}
public static Request.Builder options(){
return new Builder();
}
private Request(Builder builder){
this.params = builder.params;
this.headers = builder.headers;
this.retry = builder.retry;
this.timeout = builder.timeout;
this.url = builder.url;
this.method = builder.method;
}
/**
* 获得所有请求参数
* @return
*/
public Map<String,Object> getParameters(){
return this.params;
}
/**
* 获得所有请求头
*/
public Map<String,Object> getHeaders(){
return this.headers;
}
/**
* 获得重试次数
* @return
*/
public int getRetry(){
return this.retry;
}
/**
* 获得超时时间
* @return
*/
public int getTimeout(){
return this.timeout;
}
/**
* 获得url地址
* @return
*/
public String getUrl(){
return this.url;
}
/**
* 设置请求方法
* @return
*/
public Method getMethod(){
return this.method;
}
}
此处构建的是HTTP请求常用的一些属性,这些属性可以任意的组合,最后请看测试方法:
Request request = Request.options()
.setTimeout(5*1000)
.setUrl("http://localhost:8081/test/index")
.addParameter("name", "")
.setRetry(3)
.addHeader("", "")
.build();
构建者模式相对于普通的JavaBean中的setter/getter而言,优势是明显的,就是通过builder就能创建对象,并且为属性赋值,而不用每次都通过setter方法来赋值,从而提高了程序的可读性和可扩展性。