設計模式 —— 責任鏈模式

簡介

責任鏈模式(Chain of Responsibility Pattern)使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止。java

實例

責任鏈模式包含一下角色:數據庫

  1. Handler: 抽象處理者。定義出一個處理請求的接口。若是須要,接口能夠定義 出一個方法以設定和返回對下家的引用。這個角色一般由一個Java抽象類或者Java接口實現。
  2. ConcreteHandler:具體處理者。具體處理者接到請求後,能夠選擇將請求處理掉,或者將請求傳給下家。因爲具體處理者持有對下家的引用,所以,若是須要,具體處理者能夠訪問下家。
  3. Client:客戶類

下面咱們以一個簡單的請假做爲示例。假設請假一天,項目經理處理就能處理,三天之類歸項目總監處理,七天內歸老闆處理,請假不容許超過七天。 抽象處理者ide

public abstract class AbstractHandler {
    /** * 下一個處理對象 */
    private AbstractHandler next;
    /** * 處理請假 * * @param leaveDays 天數 * @return 處理結果 */
    public final String handleLeave(int leaveDays) {
        if (this.getLeaveDays() >= leaveDays) {
            return this.handle();
        } else {
            if (Objects.nonNull(next)) {
                return next.handleLeave(leaveDays);
            } else {
                return "大老闆都不能處理你的假期了~~";
            }
        }
    }
    /** * 具體處理 * * @return 處理結果 */
    protected abstract String handle();

    /** * 每一個處理類能處理的天數,數據可使數據庫獲取,這裏簡單就寫死了 * * @return 請假天數 */
    protected abstract Integer getLeaveDays();

    /** * 設置下一個處理類 * * @param next */
    public void setNext(AbstractHandler next) {
        this.next = next;
    }
}
複製代碼

具體處理者性能

// 項目經理處理
public class PMHandler extends AbstractHandler {

    @Override
    protected String handle() {
        return "你的請假被項目經理處理了";
    }

    @Override
    protected Integer getLeaveDays() {
        return 1;
    }
}

// 項目總監處理
public class PDHandler extends AbstractHandler {
    @Override
    protected String handle() {
        return "你的請假被項目總監處理了";
    }

    @Override
    protected Integer getLeaveDays() {
        return 3;
    }
}

// 大老闆處理
public class BossHandler extends AbstractHandler {
    @Override
    protected String handle() {
        return "你的請假被大老闆處理了";
    }

    @Override
    protected Integer getLeaveDays() {
        return 7;
    }
}
複製代碼

客戶端this

@Test
public void test() {
    PMHandler pmHandler = new PMHandler();
    PDHandler pdHandler = new PDHandler();
    BossHandler bossHandler = new BossHandler();

    pmHandler.setNext(pdHandler);
    pdHandler.setNext(bossHandler);

    String leaveRes = pmHandler.handleLeave(1);
    System.out.println(leaveRes);
    String leaveRes1 = pmHandler.handleLeave(3);
    System.out.println(leaveRes1);
    String leaveRes2 = pmHandler.handleLeave(7);
    System.out.println(leaveRes2);
    String leaveRes3 = pmHandler.handleLeave(8);
    System.out.println(leaveRes3);
}
複製代碼

類圖

責任鏈模式

優勢

  1. 下降耦合度。它將請求的發送者和接收者解耦;
  2. 簡化了對象。使得對象不須要知道鏈的結構;
  3. 加強給對象指派職責的靈活性。經過改變鏈內的成員或者調動它們的次序,容許動態地新增或者刪除責任;
  4. 增長新的請求處理類很方便。

缺點

  1. 請求沒有明確的接收者,不能保證它必定會被處理,該請求可能一直到鏈的末端都得不處處理;
  2. 對於比較長的職責鏈,請求的處理可能涉及到多個處理對象,系統性能將受到必定影響,並且在進行代碼調試時不太方便,可能會形成循環調用。

適用場景

  1. 有多個對象能夠處理同一個請求,具體哪一個對象處理該請求由運行時刻自動肯定;
  2. 在不明確指定接收者的狀況下,向多個對象中的一個提交一個請求;
  3. 可動態指定一組對象處理請求。

總結

責任鏈模式有兩種使用形式:純責任鏈模式和不純的責任鏈模式。spa

若是一個類要麼承擔責任處理請求要麼將請求踢給下一個皮球,則被稱爲純責任鏈模式;若是一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱爲不純的責任鏈模式。純的責任鏈模式的實際例子很難找到,通常看到的例子均是不純的責任鏈模式的實現。調試

相關文章
相關標籤/搜索