責任鏈模式(Chain of Responsibility)是行為模式之一,該模式構造一系列分別擔當不同職責的類的對象來共同完成一個任務,這些類的對象之間像鏈條一樣緊密相連,所以被稱作責任鏈模式。
例1:比如客戶要完成一個任務,這個任務包括a,b,c,d四個部分。 首先客戶Client把任務交給A,A完成a部分之後,把任務交給B,B完成b部分,…,直到D完成d部分。
例2:web開發中的filter和interceptor
抽象處理者(Handler)角色:定義一個請求的接口。如果需要可以定義個一個方法用來設定和返回下家對象的引用。
具體處理者(ConcreteHandler)角色:如果可以處理就處理請求,如果不能處理,就把請求傳給下家,讓下家處理。也就是說它處理自己能處理的請求且可以訪問它的下家。
public abstract class Handler { protected Handler successor; public abstract void handlerRequest(String condition); public Handler getSuccessor() { return successor; } public void setSuccessor(Handler successor) { this.successor = successor; } } public class ConcreteHandler1 extends Handler { @Override public void handlerRequest(String condition) { System.out.println("ConcreteHandler1 handled "); if (successor !=null) { successor.handlerRequest(condition); } } } public class ConcreteHandler2 extends Handler { @Override public void handlerRequest(String condition) { System.out.println("ConcreteHandler2 handled "); if (successor !=null) { successor.handlerRequest(condition); } } } public class ConcreteHandler3 extends Handler { @Override public void handlerRequest(String condition) { System.out.println("ConcreteHandler3 handled "); if (successor !=null) { successor.handlerRequest(condition); } } } public class Client { public static void main(String[] args) { Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); Handler handler3 = new ConcreteHandler3(); //鏈起來 handler1.setSuccessor(handler2); handler2.setSuccessor(handler3); handler1.handlerRequest("ConcreteHandler1"); } }
優點:
1、降低耦合度。職責鏈模式將請求處理細節(請求由哪些對象處理,怎樣處理)跟客戶端代碼隔離開來,這些細節對客戶端是透明的,客戶端只需將相應的職責添加到鏈中即可,具體的處理過程交給責任鏈,降低了系統的耦合度。
2、增強了給對象指派職責的靈活性。可以通過在運行時對職責鏈進行動態的增加或修改來改變處理一個請求的職責,職責鏈的維護是客戶端負責的,所以增加或修改責任鏈不影響類庫代碼,非常靈活。
缺點:
1、不保證請求被接受。由於責任鏈中的每個對象只處理自己感興趣的請求,對於請求是否處理過並沒有感知,這樣容易導致請求沒有對應的處理者。當一個請求的責任鏈沒有正確配置時也會導致該請求得不到處理。
2、由於責任鏈模式請求處理的不確定性,所以加大了程序調試的難度。