責任鏈模式是一種對象的行為模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織鏈和分配責任。
責任鏈可能是一條直線、一個環鏈或者一個樹結構的一部分。
一,結構:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
抽象處理者(Handler)角色: 定義出一個處理請求的接口。如果需要,接口可以定義出一個方法,以設定和返回對下家的引用。這個角色通常由一個抽象類或接口實現。
具體處理者(ConcreteHandler)角色: 具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
二,示例代碼
/** * 抽象處理者(Handler)角色 * @author Salmon * */ public abstract class Handler { protected Handler successor; //設置下家 public void setSuccessor(Handler successor) { this.successor = successor; } //處理方法 public abstract void handleRequest(int request); } /** * 具體處理者(ConcreteHandler)角色 * @author Salmon * */ public class ConcreteHandler1 extends Handler { public void handleRequest(int request) { if (request >= 0 && request < 10) System.out.println("handler by ConcreteHandler1"); else if (successor != null) successor.handleRequest(request); //交給下家處理 } } /** * 具體處理者(ConcreteHandler)角色 * @author Salmon * */ public class ConcreteHandler2 extends Handler { public void HandleRequest(int request) { if (request >= 10 && request < 20) System.out.println("handler by ConcreteHandler2"); else if (successor != null) successor.handleRequest(request); //交給下家處理 } } /** * 客戶程序 * @author Salmon * */ public class Client { public static void main(String[] args) { Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); h1.setSuccessor(h2); h2.setSuccessor(null); //形成鏈 int[] requests = { 2, 5, 14, 18, 3 }; for (int request : requests) h1.handleRequest(request); } }
三,純與不純的職責鏈模式
一個純的責任鏈模式要求一個具體的處理者對象只能在兩個行為中選擇一個:一個是承擔責任,二是把責任推給下家。不允許出現某一個具體處理者對象在承擔了一部分責任后又把責任向下傳的情況。
在一個純的責任鏈模式里面,一個請求必須被某一個處理者對象所接收;在一個不純的責任鏈模式里面,一個請求可以最終不被任何接收端對象所接收。純的責任鏈模式的例子是不容易找到的,一般看到的例子均是不純的責任鏈模式的實現。?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
