java23種設計模式十一(連載)

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;
	}
}

此處構建的是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方法來賦值,從而提升了程序的可讀性和可擴展性。
相關文章
相關標籤/搜索