java設計模式_責任鏈模式

參考來自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.htmlhtml

責任鏈是對象的一種行爲模式,在責任鏈模式中,不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。請求在這個鏈上,直到某個對象決定處理此請求。發出這個請求的客戶端並不知道是鏈上的哪個對象處理此請求,系統在不影響客戶端的狀況下動態的從新組織和分配責任。 java

從擊鼓傳花談起

  擊鼓傳花是一種熱鬧而又緊張的飲酒遊戲。在酒宴上賓客依次坐定位置,由一人擊鼓,擊鼓的地方與傳花的地方是分開的,以示公正。開始擊鼓時,花束就開始依次傳遞,鼓聲一落,若是花束在某人手中,則該人就得飲酒。ide

  好比說,賈母、賈赦、賈政、賈寶玉和賈環是五個參加擊鼓傳花遊戲的傳花者,他們組成一個環鏈。擊鼓者將花傳給賈母,開始傳花遊戲。花由賈母傳給 賈赦,由賈赦傳給賈政,由賈政傳給賈寶玉,又賈寶玉傳給賈環,由賈環傳回給賈母,如此往復,以下圖所示。當鼓聲中止時,手中有花的人就得執行酒令。this

  擊鼓傳花即是責任鏈模式的應用。責任鏈多是一條直線、一個環鏈或者一個樹結構的一部分。spa

責任鏈模式的結構

  下面使用了一個責任鏈模式的最簡單的實現。code

  責任鏈模式涉及到的角色以下所示:htm

  ●  抽象處理者(Handler)角色:定義出一個處理請求的接口。若是須要,接口能夠定義 出一個方法以設定和返回對下家的引用。這個角色一般由一個Java抽象類或者Java接口實現。上圖中Handler類的聚合關係給出了具體子類對下家的 引用,抽象方法handleRequest()規範了子類處理請求的操做。對象

  ●  具體處理者(ConcreteHandler)角色:具體處理者接到請求後,能夠選擇將請求處理掉,或者將請求傳給下家。因爲具體處理者持有對下家的引用,所以,若是須要,具體處理者能夠訪問下家。blog

抽象處理者角色:接口

package com.wangbiao.responsibilities;

public abstract class HolidayHandler {

	protected HolidayHandler handler=null;
	
	public void setProcessor(HolidayHandler handler){
		this.handler=handler;
	}
	
	public HolidayHandler getProcessor(){
		return handler;
	}
	public abstract void handlerRequest(int days);
}

具體處理者角色:

TeamLeaderHandler,ProjectManagerHandler,GeneralManager

package com.wangbiao.responsibilities;

public class TeamLeaderHandler extends HolidayHandler {

	@Override
	public void handlerRequest(int days) {
		//Team Leader days<=1
		if(days<=1){
			System.out.println("TeamLeaderHandler Approve");
		}else if(null!=getProcessor()){
			getProcessor().handlerRequest(days);
		}
	}
}

package com.wangbiao.responsibilities;

public class ProjectManagerHandler extends HolidayHandler {

	@Override
	public void handlerRequest(int days) {
		if(days>=2 && days<=5){
			System.out.println("ProjectManagerHandler Approve");
		}else if(null!=getProcessor()){
			getProcessor().handlerRequest(days);
		}

	}
}

package com.wangbiao.responsibilities;

public class GeneralManager extends HolidayHandler {

	@Override
	public void handlerRequest(int days) {
		if(days>5){
			System.out.println("GeneralManager Approve");
		}else if(null!=getProcessor()){
			getProcessor().handlerRequest(days);
		}
	}

}

package com.wangbiao.responsibilities;

/**
 * Team Leader能夠審批1天的假期,Project Manager能夠審批2-5天的假期,General Manager能夠審批5天以上的假期。
 * @author WangBiao
 *
 */
public class ResponsibilitesChain {

	
	public static void main(String[] args) {
		HolidayHandler tl=new TeamLeaderHandler();
		HolidayHandler pm=new ProjectManagerHandler();
		HolidayHandler gm=new GeneralManager();
		
		tl.setProcessor(pm);
		pm.setProcessor(gm);
		
		//begin ask for leave
		tl.handlerRequest(1);
		tl.handlerRequest(2);
		tl.handlerRequest(7);
		//result
		//TeamLeaderHandler Approve
		//ProjectManagerHandler Approve
		//GeneralManager Approve
		
	}
}
相關文章
相關標籤/搜索