設計模式之責任鏈模式

UML類圖

角色:this

  • Hanlder 抽象處理者
  • ConcreateHander 處理者實現

應用場景

針對一類請求,有多個處理方法,若是不用責任鏈模式代碼會相似爲:code

if(type = 1){
//這麼處理
}else if(type = 2){
//這麼處理
}else if(type =3){
//這麼處理
}else{
//這麼處理
}

針對這種if-elseif-else結構的分支,能夠將處理方式進行抽象封裝爲Hanlder。用鏈的形式傳遞請求到各個實現類。 好比針對一個請求Request,抽象的Hanlder處理邏輯爲:blog

public final void hanlderMessage(Request request){
//若是本身可以處理
if(request.getType().equals(this.getType)){
	//本身進行處理
	this.response()
	}else{
		if(this.getNextHanlder() == null){
		   //若是沒有接替者,按默認狀況處理
			this.hanlderMessageDefault(request);
		}else{
			//交給本身的接替者進行處理
			this.getNextHanlder().hanlderMessage(request);
		}
	}
}

大概就是這種結構,其中運用了模板方法模式,hanlderMessage就是每一個ConcreateHanlder類繼承的方法。繼承類只須要實現resonse方法來按照本身的邏輯實現處理,這個抽象Hanlder只須要提供對外的方法setType用來定義本身的處理級別與請求的類型相對應,以及hanlderMessage來處理請求。繼承

優勢

優勢是封裝了if-elseif-else這種的邏輯分支,將請求與處理分了開來,請求只須要關心抽象的Hanlder。而具體實現ConcreateHanlder也不用關心具體的請求全貌,只須要處理本身的方式。若是須要擴展處理只須要多實現一個Hanlder就能夠了。內存

缺點

缺點也很明顯,這種鏈表的調用形式,若是調用鏈過長會浪費棧內存空間。get

相關文章
相關標籤/搜索