責任鏈設計模式
1.定義
使多個物件都有機會處理請求,從而避免了請求的傳送者與接受者之間的耦合關係,將這些物件生成一個鏈,並沿著這條鏈傳遞該物件,只到有物件處理這個請求為止,即:將一個請求從鏈式的首端發出,沿著鏈的路徑依次傳遞給每一個節點物件,直至有物件處理這個請求為止,將這樣的一種模式稱為責任鏈設計模式
2.結構圖

image.png
3.使用場景
多個物件可以處理同一個請求,但具體由哪個物件處理,只有到執行的時候動態決定
4.抽象簡單實現示例:
/** * 抽象處理著角色,宣告請求處理方法,並在其中保留一個對下一個處理節點的物件的引用 */ public abstract class Handler { /** * 下一個節點的處理者 */ protected Handler successor; /** * 處理請求方法 * @param condition */ public abstract void handleRequest(String condition); }
/** * 第一個物件處理者 */ public class Handler1 extends Handler { @Override public void handleRequest(String condition) { if (condition.equals("handler1Request")){ System.out.println("Handler1 handler request"); return; }else{ successor.handleRequest(condition); } } }
/** * 第二個物件處理者 */ public class Handler2 extends Handler { @Override public void handleRequest(String condition) { if (condition.equals("handler2Request")){ System.out.println("Handler2 handler request"); return; }else{ successor.handleRequest(condition); } } }
public class Main { public staticvoid main(String args[]){ //how to use Handler1 handler1=new Handler1(); Handler2 handler2 =new Handler2(); handler1.successor=handler2; handler2.successor=handler1; handler1.handleRequest("handler2Request"); } }

image.png
5.具體場景使用示例:
公司員工進行報銷單子,假如組長的報銷的金額是1000,經理報銷的金額是3000,超過3000的則老闆進行報銷,模擬以上場景,實現責任鏈示例如下:
/** * 抽象領導 */ public abstract class Leader { //上級領導 Leader nextHandler; //報銷金額 abstract int limit(); //具體處理請求方法 abstract void handler(int money); //是否處理請求判斷 void handerRequest(int money) { if (money < limit()) { handler(money); } else { if (nextHandler != null) nextHandler.handerRequest(money); } } }
/** * 老闆 */ public class BossHandler extends Leader { @Override int limit() { return Integer.MAX_VALUE; } @Override void handler(int money) { System.out.println("老闆報銷了:" + money); } }
/** * 經理 */ public class ManagerHandler extends Leader { @Override int limit() { return 3000; } @Override void handler(int money) { System.out.println("專案經理報銷了:" + money); } }
/** * 組長 */ public class GroupHandler extends Leader { @Override int limit() { return 1000; } @Override void handler(int money) { System.out.println("組長報銷了:" + money); } }
public class Me { public static void main(String args[]) { GroupHandler groupHandler = new GroupHandler(); ManagerHandler managerHandler = new ManagerHandler(); BossHandler bossHandler = new BossHandler(); groupHandler.nextHandler = managerHandler; managerHandler.nextHandler = bossHandler; groupHandler.handerRequest(500); groupHandler.handerRequest(1900); groupHandler.handerRequest(8000); } }

image.png