1. 程式人生 > >八、責任鏈設計模式

八、責任鏈設計模式

1. 責任鏈模式介紹

使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。

考慮到如下情景:
小李要出差,出差之後,小李要報銷經費,小李申請了50000塊的經費。

  1. 首先向組長提出,組長,他只能報銷2000元以內的。組長把小李的請求向主管提出。

  2. 主管收到申請後,主管說他也無法批准,他只能批准5000以內的,所以主管把請求又遞交給了總經理。

  3. 總經理收到請求後,他只能批准10000以內的,所以主管把請求又遞交給了老闆。

  4. 老闆收到請求後,把小李的請求給處理了。

以上請求就是一個責任鏈模式,發出請求者並不知道誰會來處理請求,每個領導會根據自己的職責範圍,來判斷是處理還是把請求遞交給更高級別的領導。只要有領導處理了,傳遞就結束了。

2. 責任鏈模式使用場景

  • 多個物件可以處理同一請求,單具體由哪個物件處理則在執行時動態決定的。
  • 在請求矗立著不明確的情況下向多個物件中的一個提交一個請求。
  • 需要動態指定一組物件處理請求。

3. 責任鏈模式UML類圖

責任鏈UML

4. 責任鏈模式簡單實現

情景描述:介紹裡面描述的申請經費案例。

包結構:

責任鏈模式包結構

(1) 首先宣告一個抽象的老闆類:

public abstract class Leader {
        protected Leader nextHandler;//上一級領導處理者

        public void handleRequest
(int money) { if (money <= limit()) { handleMoney(money); } else { if (nextHandler != null) { nextHandler.handleRequest(money); } } } //處理 protected abstract void handleMoney
(int money); //每一級領導能夠批准的額度 protected abstract int limit(); }

在上述抽象類中,發起請求時,呼叫handleRequest()方法,步驟如下:

  1. 在handleRequest方法中,首先判斷傳遞進來的money是否小於當前領導能夠批准的額度。這個額度由 limit()這個方法返回,limit()是一個抽象方法,由具體的領導實現。

  2. 如果money小於當前領導所能處理的額度,呼叫handleMoney(money)方法,handleMOney(money)也是一個抽喜類,由具體的領導類實現。

  3. 如果money大於當前領導所能處理的額度,呼叫上一級領導的handleReqeust()方法。

  4. 重複以上1、2、3步驟,直到結束。

(2)具體的領導類:Boos,DirectorLeader,GroupLeader,ManagerLeader:

public class Boss extends Leader {
        @Override
        protected void handleMoney(int money) {
            System.out.println("老闆報銷: " + money);
        }

        @Override
        protected int limit() {
            return Integer.MAX_VALUE;
        }
}

(3)測試類:

public class Person {
        public static void main(String[] args) {
            //構造各個級別領導
            GroupLeader groupLeader = new GroupLeader();
            DirectorLeader directorLeader = new DirectorLeader();
            ManagerLeader managerLeader = new ManagerLeader();
            Boss boss = new Boss();

            //設定上一級領導處理物件
            groupLeader.nextHandler = directorLeader;
            directorLeader.nextHandler = managerLeader;
            managerLeader.nextHandler = boss;

            //申請報銷
            groupLeader.handleRequest(50000);
        }
}
  • 對於責任鏈來說,一個請求最終只有兩種情況:一是被某個處理物件處理,另一個是所有的物件均為對其處理。 對於前一種情況,我們稱該物件為純的責任鏈,對於後一種情況我們稱為不純的責任鏈,在實際應用中,我們所見的責任鏈模式大多為不純的責任鏈模式。

5. 責任鏈模式在Android系統中

android觸控事件流程是一個典型的責任鏈模式,具體網上有很多優質的文章介紹,這裡就不做贅述了。
這裡推薦一篇個人決定不錯的文章。

6. 責任鏈模式在Android開發中

責任鏈模式可以替代各種分支和條件判斷語句,這裡就不做具體舉例。

7. 總結

  • 優點:
    • 可以對請求者和處理者關係解耦,提高程式碼的靈活性。
  • 缺點:
    • 對鏈中請求處理的遍歷,如果處理者太多,那麼遍歷必定會影響效能。