11、構建者模式java
構建者模式主要是用於建立複雜的一些對象,這些對象的建立步驟基本固定,可是可能具體的對象的組成部分卻又能夠自由的變化,好比房子裝修,我能夠在臥室裏放電視,也能夠不放電視,我還能夠擺個電腦,這些屬性能夠自由變化。測試
要構建這樣一個對象,就須要一個建立一個Builder,用於構建須要的對象。ui
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; } }
Request request = Request.options() .setTimeout(5*1000) .setUrl("http://localhost:8081/test/index") .addParameter("name", "") .setRetry(3) .addHeader("", "") .build();構建者模式相對於普通的JavaBean中的setter/getter而言,優點是明顯的,就是經過builder就能建立對象,而且爲屬性賦值,而不用每次都經過setter方法來賦值,從而提升了程序的可讀性和可擴展性。