Java模式開發之責任鏈模式
從擊鼓傳花談起
擊鼓傳花是一種熱鬧而又緊張的飲酒游戲。在酒宴上賓客依次坐定位置,由一人擊鼓,擊鼓的地方與傳花的地方是分開的,以示公正。開始擊鼓時,花束就開始依次傳遞,鼓聲一落,如果花束在某人手中,則該人就得飲酒。
假比說,賈母、賈赦、賈政、賈寶玉和賈環是五個參加擊鼓傳花游戲的傳花者,他們組成一個環鏈。擊鼓者將花傳給賈母,開始傳花游戲。花由賈母傳給賈赦,由賈赦傳給賈政,由賈政傳給賈寶玉,又由賈寶玉傳給賈環,由賈環傳回給賈母,如此往復(見下圖)。當鼓聲停止時,手中有花的人就得執行酒令。
圖1、擊鼓傳花。
擊鼓傳花便是責任鏈模式的應用。在責任鏈模式里,很多的對象由每一個對象對其下家的引用而聯接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織鏈和分配責任。
責任鏈可能是一條直線、一個環鏈甚至一個樹結構的一部分。
責任鏈模式的結構
責任鏈模式是一種對象的行為模式,它所涉及到的角色如下:
第一、抽象處理者(Handler)角色、定義出一個處理請求的接口;如果需要,接口可以定義出一個方法,以返回對下家的引用。下圖給出了一個示意性的類圖:

圖2、抽象處理者角色。
在圖中的積累關系給出了具體子類對下家的引用,抽象方法handleRequest()規范了子類處理請求的操作。
第二、具體處理者(ConcreteHandler)角色、處理接到請求后,可以選擇將請求處理掉,或者將請 求傳給下家。下圖給出了一個示意性的類圖。

圖3、具體處理者角色。
上圖中的示意性的具體處理者ConcreteHandler類只有handleRequest()一個方法。
責任鏈模式的靜態類結構可見下圖:

圖4、責任鏈模式的類圖定義。
在圖中還給出了一個客戶端,以便讀者可以更清楚地看到責任鏈模式是怎樣應用的。抽象處理者的示意性源代碼:
public class Handler { public void handleRequest() { if (successor != null) { successor.handleRequest(); } // Write your code here } public void setSuccessor(Handler successor) { this.successor = successor; } public Handler getSuccessor() { return successor; } private Handler successor; } |
具體處理者的示意性源代碼:
public class ConcreteHandler extends Handler { public void handleRequest() { if (getSuccessor() != null) { getSuccessor().handleRequest(); } if (successor != null) { successor.handleRequest(); } // Write your code here } } |
客戶端的源代碼如下:
public class Client { private Handler handler; public static void main(String[] args) { handler = new ConcreteHandler(); //write your code here } } |
代碼清單3、客戶端的源代碼。