Chain of Responsibility(CoR)責任鏈設計模式是用一系列請求處理器試圖處理一個請求,這些請求處理器之間是一個鬆散耦合,惟一的共同點是在他們之間傳遞請求。例如客戶端發送一個請求,請求處理器A先處理,若是A沒有處理或者沒法處理,就將請求傳遞給請求處理器B,若是B沒有處理或者沒法處理,就將請求傳遞到請求處理器C去處理,全部這些請求處理器構成一條請求處理責任鏈。Chain of Responsibility責任鏈設計模式的結構以下: java
Chain of Responsibility責任鏈設計模式的時序圖以下: 設計模式
一個處理數字,字母和特殊符號的例子演示Chain of Responsibility,代碼以下: this
//抽象請求處理器 abstract class Handler{ private Handler successor; public Handler(Handler successor){ this.successor = successor; } public Handler getSuccessor(){ return successor; } public void handRequest(Request request); } //Request請求類 class Request{ private String type; public Request(String type){ this.type = type; } public String getType(){ return type; } } //數字請求處理器 class NumberHandler extends Handler{ public NumberHandler(){ } public NumberHandler(Handler successor){ super(successor); } public void handRequest(Request request){ if(request.getType().equals(「Number」)){ System.out.println(「Number has been handled」); } //傳遞到下一個請求處理器處理 else{ getSuccessor().handRequest(request); } } } //字母請求處理器 class CharacterHandler extends Handler{ public CharacterHandler(){ } public CharacterHandler(Handler successor){ super(successor); } public void handRequest(Request request){ if(request.getType().equals(「Character」)){ System.out.println(「Character has been handled」); } //傳遞到下一個請求處理器處理 else{ getSuccessor().handRequest(request); } } } //特殊符號請求處理器 class SymbolHandler extends Handler{ public SymbolHandler(){ } public SymbolHandler(Handler successor){ super(successor); } public void handRequest(Request request){ if(request.getType().equals(「Symbol」)){ System.out.println(「Symbol has been handled」); } //傳遞到下一個請求處理器處理 else{ getSuccessor().handRequest(request); } } } public class Application{ public static void main(String[] args){ Handler numberHandler = new NumberHandler(); Handler characterHandler = new CharacterHandler(); Handler symbolHandler = new SymbolHandler(); numberHandler.setSuccessor(characterHandler); characterHandler.setSuccessor(symbolHandler); Request request1 = new Request(「Number」); Request request2 = new Request(「Character」); Request request3 = new Request(「Symbol」); numberHandler. handRequest(request1); numberHandler. handRequest(request2); numberHandler. handRequest(request3); } }
(1).Java的異常處理機制,當程序中發生異常時,try-catch會比較所捕捉的異常是否符合異常類型,若是符合就執行所設定的處理,若是都沒有比對到適當的異常,就會將異常丟出try-catch區塊以外。 編碼
(2).Struts1.x中的filter過濾器鏈,Struts2.x中攔截器鏈等等,將HTTP請求處理中的字符編碼轉換,加密/解密等經常使用功能分別做爲一個個的請求處理器,接收到客戶端請求時對其進行處理,同時在向客戶端返回服務端響應時也使用這些處理器進行處理。