1. 程式人生 > >快速上手設計模式12 - 責任鏈模式

快速上手設計模式12 - 責任鏈模式

終於把專案昨晚了,抽時間開始整理行為型的設計模式,責任鏈模式;
責任鏈模式概述:責任鏈模式是一種物件的行為模式。在責任鏈模式裡,很多物件由每一個物件對其下家的引用而連線起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。

不是很理解,舉個簡單的例子:我要請10天年假,我就把請假申請提交給領導,本來請假5天以上的要大老闆來審批,可是我不需要關心誰來處理這個請求,只要申請審批通過了就行。

首先建立抽象處理物件

public abstract
class Handler { /** 持有下一個處理請求的物件 */ protected Handler next = null; public Handler getNext() { return next; } public void setNext(Handler next) { this.next = next; } /** * 抽象處理請求的方法 */ public abstract void handleRequest(Integer day); }

接著建立我的直屬領導和大老闆物件來處理我的請假申請

public class LeaderHandler
extends Handler { @Override public void handleRequest(Integer day) { /** * leader只能審批五天以下的休假申請,五天以上的申請交給大老闆處理 */ if (day > 5) { System.out.println("無法審批五天以上的休假申請,傳遞請求"); getNext().handleRequest(day); } else { System.out.println("處理申請,審批通過"); } } } public class BossHandler
extends Handler { /** * 大老闆什麼申請都可以處理 */ @Override public void handleRequest(Integer day) { System.out.println("處理申請,審批通過"); } }

客戶端

// 組裝責任鏈
Handler leader = new LeaderHandler();
Handler boss = new BossHandler();
leader.setNext(boss);
// 提交10天的休假請求
leader.handleRequest(10);

顯示結果

無法審批五天以上的休假申請,傳遞請求
處理申請,審批通過

責任鏈的核心就是為了避免請求的傳送者和處理者耦合在一起,於是將處理者組合成一條鏈,沿著鏈傳遞請求,直至某個點來處理這個請求。
這樣做的好處是降低耦合,請求者不需要知道誰來最終處理這個請;同時增加了靈活性,當有新的型別的請求時,只需要在責任鏈中加一個處理該請求的類即可
缺點是一定程度的損耗了效能,除錯起來也不太方便,必須要找到處理這個請求的具體物件。

責任鏈模式還分純責任鏈和不純的責任鏈,可根據實際情況應用;
純責任鏈是保證每個請求最終都會有一個物件來處理它
不純的責任鏈是請求傳遞結束後都沒有一個物件處理它或者有多個物件來處理它

責任鏈模式的應用很普遍,我們常用的過濾器、攔截器就是使用的責任鏈模式。