標籤:
使多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
*在一個純的職責鏈模式裡面,一個請求必須被某一個處理者對象所接收;在一個不純的職責鏈模式裡面,一個請求可以最終不被任何接收端對象所接收。
適用性
在以下條件下使用Responsibility 鏈:
有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
可動態指定一組對象處理請求。
模式的組成
抽象處理者角色(Handler:Approver):定義一個處理請求的介面,和一個後繼串連(可選)
具體處理者角色(ConcreteHandler:President):處理它所負責的請求,可以訪問後繼者,如果可以處理請求則處理,否則將該請求轉給他的後繼者。
客戶類(Client):向一個鏈上的具體處理者ConcreteHandler對象提交請求。
優點
降低耦合度 :該模式使得一個對象無需知道是其他哪一個對象處理其請求。對象僅需知道該請求會被“正確”地處理。接收者和寄件者都沒有對方的明確的資訊,且鏈中的對象不需知道鏈的結構。
職責鏈可簡化對象的相互串連:結果是,職責鏈可簡化對象的相互串連。它們僅需保持一個指向其後繼者的引用,而不需保持它所有的候選接受者的引用。
增強了給對象指派職責(Responsibility)的靈活性:當在對象中指派職責時,職責鏈給你更多的靈活性。你可以通過在運行時刻對該鏈進行動態增加或修改來增加或改變處理一個請求的那些職責。你可以將這種機制與靜態特例化處理對象的繼承機制結合起來使用。
增加新的請求處理類很方便
缺點
不能保證請求一定被接收。既然一個請求沒有明確的接收者,那麼就不能保證它一定會被處理 —該請求可能一直到鏈的末端都得不到處理。一個請求也可能因該鏈沒有被正確配置而得不到處理。
系統效能將受到一定影響,而且在進行代碼調試時不太方便;可能會造成迴圈調用。
實現
人類的發展,然後對人類的需求進行分析實現。類圖如下:
AbstractHuman的定義:
package com.lidaming.design18.chain;public abstract class AbstractHuman { public AbstractHuman human; public void setHuman(AbstractHuman huamn){ this.human=huamn; } public abstract void process(String need);}View Code
FoodManager的定義:
package com.lidaming.design18.chain;public class FoodMananger extends AbstractHuman { @Override public void process(String need) { if(need=="food") { System.out.println("food is enough"); } else { if(human!=null) { human.process(need); } else { System.out.println("sorry,i have no food"); } } }}View Code
ToolManager的定義:
package com.lidaming.design18.chain;public class ToolMananger extends AbstractHuman { @Override public void process(String need) { if(need=="tool") { System.out.println("give you a tool"); } else { if(human!=null) { human.process(need); } else { System.out.println("sorry,we can not for you"); } } }}View Code
HumanManager的定義:
package com.lidaming.design18.chain;public class HumanManager extends AbstractHuman { @Override public void process(String need) { if (need.equals("job")) { System.out.println("give u an offer"); } else { if (human != null) { human.process(need); } else { System.out.println("no offer for u"); } } }}View Code
情境類的實現:
package com.lidaming.design18.chain;public class Client { public static void main(String[] args) { FoodMananger food = new FoodMananger(); ToolMananger tool = new ToolMananger(); HumanManager human = new HumanManager(); food.setHuman(tool); tool.setHuman(human); food.process("tool"); food.process("aa"); }}View Code
參考
http://www.jayfeng.com/2016/04/09/理解設計模式之狀態模式、職責鏈模式/
http://blog.csdn.net/hguisu/article/details/7547231
設計模式——職責鏈模式