责任链
http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html
責(zé)任鏈模式是一種對象的行為模式。在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任。
從擊鼓傳花談起
擊鼓傳花是一種熱鬧而又緊張的飲酒游戲。在酒宴上賓客依次坐定位置,由一人擊鼓,擊鼓的地方與傳花的地方是分開的,以示公正。開始擊鼓時,花束就開始依次傳遞,鼓聲一落,如果花束在某人手中,則該人就得飲酒。
比如說,賈母、賈赦、賈政、賈寶玉和賈環(huán)是五個參加擊鼓傳花游戲的傳花者,他們組成一個環(huán)鏈。擊鼓者將花傳給賈母,開始傳花游戲。花由賈母傳給賈赦,由賈赦傳給賈政,由賈政傳給賈寶玉,又賈寶玉傳給賈環(huán),由賈環(huán)傳回給賈母,如此往復(fù),如下圖所示。當(dāng)鼓聲停止時,手中有花的人就得執(zhí)行酒令。
擊鼓傳花便是責(zé)任鏈模式的應(yīng)用。責(zé)任鏈可能是一條直線、一個環(huán)鏈或者一個樹結(jié)構(gòu)的一部分。
責(zé)任鏈模式的結(jié)構(gòu)
下面使用了一個責(zé)任鏈模式的最簡單的實現(xiàn)。
責(zé)任鏈模式涉及到的角色如下所示:
● 抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義 出一個方法以設(shè)定和返回對下家的引用。這個角色通常由一個Java抽象類或者Java接口實現(xiàn)。上圖中Handler類的聚合關(guān)系給出了具體子類對下家的引用,抽象方法handleRequest()規(guī)范了子類處理請求的操作。
● 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
源代碼
抽象處理者角色
public abstract class Handler {/*** 持有后繼的責(zé)任對象*/protected Handler successor;/*** 示意處理請求的方法,雖然這個示意方法是沒有傳入?yún)?shù)的* 但實際是可以傳入?yún)?shù)的,根據(jù)具體需要來選擇是否傳遞參數(shù)*/public abstract void handleRequest();/*** 取值方法*/public Handler getSuccessor() {return successor;}/*** 賦值方法,設(shè)置后繼的責(zé)任對象*/public void setSuccessor(Handler successor) {this.successor = successor;}}具體處理者角色
public class ConcreteHandler extends Handler {/*** 處理方法,調(diào)用此方法處理請求*/@Overridepublic void handleRequest() {/*** 判斷是否有后繼的責(zé)任對象* 如果有,就轉(zhuǎn)發(fā)請求給后繼的責(zé)任對象* 如果沒有,則處理請求*/if(getSuccessor() != null){ System.out.println("放過請求");getSuccessor().handleRequest(); }else{ System.out.println("處理請求");}}}客戶端類
public class Client {public static void main(String[] args) {//組裝責(zé)任鏈Handler handler1 = new ConcreteHandler();Handler handler2 = new ConcreteHandler();handler1.setSuccessor(handler2);//提交請求 handler1.handleRequest();}}可以看出,客戶端創(chuàng)建了兩個處理者對象,并指定第一個處理者對象的下家是第二個處理者對象,而第二個處理者對象沒有下家。然后客戶端將請求傳遞給第一個處理者對象。
由于本示例的傳遞邏輯非常簡單:只要有下家,就傳給下家處理;如果沒有下家,就自行處理。因此,第一個處理者對象接到請求后,會將請求傳遞給第二個處理者對象。由于第二個處理者對象沒有下家,于是自行處理請求。活動時序圖如下所示。
總結(jié)
- 上一篇: 如何设置eclipse下查看java源码
- 下一篇: 《JAVA与模式》之模板方法模式