責任鏈模式
本文主要內容
- 責任鏈模式簡介
- 責任鏈模式示例
- 總結
1、責任鏈模式簡介
什麼是鏈呢?比如說多節鐵環串起來就叫鏈, 鏈
強調的是,鐵環可以自由拆卸安裝,都不會影響整個鏈的使用。責任鏈模式是一種非常自由的模式
使多個物件都有機會處理請求,從而避免了請求的分發者和接收者之間的耦合。將這些物件形成一條鏈,並沿著這條鏈傳遞該請求,只到有物件處理它為止。
責任鏈適宜的情況:
- 多個物件可以處理同一請求,但具體由哪個物件處理則在執行時動態決定
- 在請求處理者不明確的情況下向多個物件中的一個提交一個請求
- 需要動態指定一組處理處理請求

責任鏈模式UML圖
在android中,有非常多的責任鏈示例,比如touch事件傳遞,另外廣播也是。曾看過okhttp的原始碼,它內部也是一個責任鏈模式,程式碼非常優雅,有興趣的同學可以看看。
2、責任鏈模式示例
我們以單位報銷為示例,寫一個demo,不同的領導有不同的經費報銷許可權或者限制,比如小組長只能批覆報銷1000元,而經理可以批覆報銷10000,以此為例。
先定義一個領導的抽象類:
public abstract class Leader { protected Leader nextLeader; public abstract int limit(); public abstract void handle(int money); public final void handleRequest(int money){ if (money < limit()) { handle(money); }else { if (nextLeader != null) { nextLeader.handleRequest(money); } } } }
此處必須寫一個抽象類,而不能是介面。經常會有人問到,抽象類和介面有什麼區別,此處就是區別之一。抽象類中可以有非抽象方法還能定義非靜態成員變數,Leader 類中必須要有處理請求的方法 handleRequest
,而且還是 final 的,子類不能重寫,才能保證整個機制的運轉。
接下來看小組長類定義:
public class GroupLeader extends Leader{ @Override public int limit() { return 1000; } @Override public void handle(int money) { System.out.println("組長批覆報銷" + money + "元"); } }
再看主管的定義:
public class Director extends Leader{ @Override public int limit() { return 5000; } @Override public void handle(int money) { System.out.println("主管批覆報銷" + money + "元"); } }
再看看經理的定義:
public class Manager extends Leader{ @Override public int limit() { return 10000; } @Override public void handle(int money) { System.out.println("經理批覆報銷" + money + "元"); } }
最後看老闆的定義:
public class Boss extends Leader{ @Override public int limit() { return Integer.MAX_VALUE; } @Override public void handle(int money) { System.out.println("老闆批覆報銷" + money + "元"); } }
員工是如何申請報銷的呢?
public class Staff { public static void main(String[] args) { GroupLeader groupLeader = new GroupLeader(); Director director = new Director(); Manager manager = new Manager(); Boss boss = new Boss(); groupLeader.nextLeader = director; director.nextLeader = manager; manager.nextLeader = boss; groupLeader.handleRequest(50000); } }
整個示例就結束了。責任鏈模式中的任意一個環節都是可以去掉的,比如上例當中,可以不向老闆申請報銷,這就是責任鏈的靈活之處
3、總結
在日常生活中還是要多看各種不同的程式碼,比如第一次看okhttp的原始碼,發現其中的責任鏈模式,我回味了好久,當時就感覺程式碼非常非常優雅。我們又學到了一種牛逼的程式碼方式 。