職責鏈模式:(Chain of Responsibility) :使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理他爲止。java
類型:形爲型模式 git
順口溜:中訪策備迭 觀模命狀職解github
職責鏈能夠是一條直線、一個環或者一個樹形結構,最多見的職責鏈是直線型,即沿着一條單向的鏈來傳遞請求。ide
鏈上的每個對象都是請求處理者,職責鏈模式能夠將請求的處理者組織成一條鏈,並使請求沿着鏈傳遞,由鏈上的處理者對請求進行相應的處理,客戶端無須關心請求的處理細節以及請求的傳遞,只需將請求發送到鏈上便可,將請求的發送者和請求的處理者解耦。這就是職責鏈模式的模式動機。性能
package com.amosli.dp.behavior.cor; public abstract class Handler { protected Handler handler; public void setSuccessor(Handler handler) { this.handler = handler; } public abstract void handleRequest(int request); } package com.amosli.dp.behavior.cor; public class ConcreteHandler1 extends Handler { @Override public void handleRequest(int request) { if (request < 0) { System.out.println("request is null"); } else if (handler != null) { handler.handleRequest(request); } } } package com.amosli.dp.behavior.cor; public class ConcreteHandler2 extends Handler { @Override public void handleRequest(int request) { if (request >= 0 && request < 10) { System.out.println("so,0<=request<10"); } else if (handler != null) { handler.handleRequest(request); } } } package com.amosli.dp.behavior.cor; public class ConcreteHandler3 extends Handler { @Override public void handleRequest(int request) { if (request>=10) { System.out.println("so,request>=10"); } else if (handler != null) { handler.handleRequest(request); } } } package com.amosli.dp.behavior.cor; public class Client { public static void main(String[] args) { ConcreteHandler1 h1 = new ConcreteHandler1(); ConcreteHandler2 h2 = new ConcreteHandler2(); ConcreteHandler3 h3 = new ConcreteHandler3(); h1.setSuccessor(h2); h2.setSuccessor(h3); h1.handleRequest(20); } }
有多個的對象能夠處理一個請求,哪一個對象處理該請求運行時刻自動肯定。this
你想在不明確指定接收者的狀況下,向多個對象中的一個提交一個請求。spa
可動態指定一組對象處理請求。調試
1 ) 下降耦合度 :該模式使得一個對象無需知道是其餘哪個對象處理其請求。對象僅需知道該請求會被「正確」地處理。接收者和發送者都沒有對方的明確的信息,且鏈中的對象不需知道鏈的結構。code
2) 職責鏈可簡化對象的相互鏈接 : 結果是,職責鏈可簡化對象的相互鏈接。它們僅需保持一個指向其後繼者的引用,而不需保持它全部的候選接受者的引用。orm
3) 加強了給對象指派職責( R e s p o n s i b i l i t y )的靈活性 :當在對象中分派職責時,職責鏈給你更多的靈活性。你能夠經過在運行時刻對該鏈進行動態的增長或修改來增長或改變處理一個請求的那些職責。你能夠將這種機制與靜態的特例化處理對象的繼承機制結合起來使用。
4)增長新的請求處理類很方便
1) 不能保證請求必定被接收。既然一個請求沒有明確的接收者,那麼就不能保證它必定會被處理 —該請求可能一直到鏈的末端都得不處處理。一個請求也可能因該鏈沒有被正確配置而得不處處理。
2) 系統性能將受到必定影響,並且在進行代碼調試時不太方便;可能會形成循環調用。
3)當這個鏈結構比較長,比較複雜的話,會產生不少的內存垃圾對象。
本系列文章源碼地址,https://github.com/amosli/dp 歡迎Fork & Star !!