參考來自: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 } }