設計模式 --- 責任鏈模式
阿新 • • 發佈:2018-11-22
1.定義
使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,只到有物件處理它為止。
2.使用場景
多個物件可以處理同一請求,但具體由哪個物件處理則在執行時動態決定。
在請求處理者不明確的情況下向多個物件中的一個提交一個請求。
需要動態指定一組物件處理請求。
3.簡單實現
以一個費用報銷為例。組長只能審批1000元以下費用,主管能審批5000元以下費用,經理能審批10000元以下費用,一萬元以上需要老闆審批。
//領導抽象 abstract class Leader{ //上一級領導處理 即 下一個處理節點 protected Leader nextHandler; //自身能審批額度 abstract int limit(); //處理報銷行為 abstract void handle(int money); //處理報銷請求 final void handleRequest(int money){ if (money <= limit()){ handle(money); }else { //交給下一節點 if (null != nextHandler){ nextHandler.handleRequest(money); } } } } //組長 class GroupLeader extends Leader{ @Override int limit() { //限額1000 return 1000; } @Override void handle(int money) { System.out.println("組長批覆報銷" + money + " 元"); } } //主管 class Director extends Leader{ @Override int limit() { //限額5000 return 5000; } @Override void handle(int money) { System.out.println("主管批覆報銷" + money + " 元"); } } //經理 class Manager extends Leader{ @Override int limit() { //限額10000 return 10000; } @Override void handle(int money) { System.out.println("經理批覆報銷" + money + " 元"); } } //Boss class Boss extends Leader{ @Override int limit() { //無限 return Integer.MAX_VALUE; } @Override void handle(int money) { System.out.println("老闆牛逼!批覆報銷" + money + " 元"); } } public class RespChainMode { public static void main(String[] args){ //構造領導 GroupLeader groupLeader = new GroupLeader(); Director director = new Director(); Manager manager = new Manager(); Boss boss = new Boss(); //設定交給上級處理 groupLeader.nextHandler = director; director.nextHandler = manager; manager.nextHandler = boss; //請求報銷 groupLeader.handleRequest(3489); groupLeader.handleRequest(20210); } }
輸出:
4.小結
優點:
可以對請求者和處理者關係解耦,提高程式碼靈活性
缺點:
對請求處理者需要遍歷,如果處理者太多影響效能,特別是在一些遞迴呼叫中。