設計模式之責任鏈模式【Chain Of Responsibility Pattern】

當客戶端發出一個請求,有多個對象都有機會來處理這個請求,但是客戶端不知道究竟誰會來處理他的請求時,這是就可以使用責任鏈模式來處理這種情況。

1、定義

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

2、使用場景

  1. 多個對象可以處理一個請求,但具體由哪個對象處理則在運行時動態決定。
  2. 在請求者不明確的情況下向多個對象中的一個提交一個請求。
  3. 需要動態指定一組對象處理請求。

3、UML圖

這裏寫圖片描述

4、示例代碼

public abstract class Handler {

    /**
     * 持有後繼的責任對象
     */
    protected Handler successor;

    /**
     * 示意處理請求的方法,雖然這個示意方法是沒有傳入參數的 
     * 但實際是可以傳入參數的,根據具體需要來選擇是否傳遞參數
     */
    public abstract void handleRequest();

    /**
     * 設置後繼的責任對象
     */
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
}

public class ConcreteHandler1 extends Handler {
    /**
     * 處理方法,調用此方法處理請求
     */
    @Override
    public void handleRequest() {

        /**
         * 根據某些條件來判斷是否屬於自己處理的職責範圍
         */
        boolean condition = false;

        if (condition) {
            System.out.println("ConcreteHandler1 處理請求");
        } else {
            if(successor != null) {
                System.out.println("ConcreteHandler1 處理不了,交給下個 handler 處理請求");
                successor.handleRequest();
            }
        }
    }
}

public class ConcreteHandler2 extends Handler {

    @Override
    public void handleRequest() {

        /**
         * 根據某些條件來判斷是否屬於自己處理的職責範圍
         */
        boolean condition = true;

        if (condition) {
            System.out.println("ConcreteHandler2 處理請求");
        } else {
            if(successor != null) {
                System.out.println("交給下個 handler 處理請求");
                successor.handleRequest();
            }
        }
    }
}

客戶端調用:

public class Client {

    public static void main(String args[]) {
        // 組裝責任鏈
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setSuccessor(handler2);
        // 提交請求
        handler1.handleRequest();
    }
}

結果輸出:
這裏寫圖片描述

責任鏈模式的本質是分離職責,動態組合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章