abstract:原理在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任。組成 責(zé)任鏈模式涉及到的角色如下所示: ● 抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義出一個方法以
原理
在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任。
組成
責(zé)任鏈模式涉及到的角色如下所示:
● 抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義出一個方法以設(shè)定和返回對下家的引用。這個角色通常由一個Java抽象類或者Java接口實現(xiàn)。上圖中Handler類的聚合關(guān)系給出了具體子類對下家的引用,抽象方法handleRequest()規(guī)范了子類處理請求的操作。
● 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
純的與不純的責(zé)任鏈模式
一個純的責(zé)任鏈模式要求一個具體的處理者對象只能在兩個行為中選擇一個:一是承擔(dān)責(zé)任,而是把責(zé)任推給下家。不允許出現(xiàn)某一個具體處理者對象在承擔(dān)了一部分責(zé)任后又把責(zé)任向下傳的情況。
在一個純的責(zé)任鏈模式里面,一個請求必須被某一個處理者對象所接收;在一個不純的責(zé)任鏈模式里面,一個請求可以最終不被任何接收端對象所接收。
純的責(zé)任鏈模式的實際例子很難找到,一般看到的例子均是不純的責(zé)任鏈模式的實現(xiàn)。有些人認為不純的責(zé)任鏈根本不是責(zé)任鏈模式,這也許是有道理的。但是在實際的系統(tǒng)里,純的責(zé)任鏈很難找到。如果堅持責(zé)任鏈不純便不是責(zé)任鏈模式,那么責(zé)任鏈模式便不會有太大意義了。