責任鏈模式——消除大量的 else if

設計模式的使用是將元數據從邏輯代碼中剝離出來,避免因元數據(Metadata)變化導致修改程序。程序本身只是邏輯的集合,而元數據(輔助程序行爲,諸如語言包文件)應集中在配置文件裏;待處理的數據來自外部輸入(用戶輸入、本地文件、數據庫等)

責任鏈模式屬於行爲模式中的一種,特別關注對象之間的通信。主要解決職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了。
責任鏈的優點接受者和發送者都沒有對方的信息,且鏈中的自己也不知道整個鏈的結構,他們僅需保持一個指向其後繼者的引用。這大大降低了耦合度。還可以隨時隨地增加或者修改一個請求的結構,增強了靈活性和擴展性。基於這樣的框架,它的代碼總量也許比原來的要多,但你不再需要在一堆if else中仔細推敲代碼執行的前提條件。

在這裏插入圖片描述

// 定義一個處理請求的接口
public abstract class Handler {

     protected Handler successor;

     public void setSuccessor(Handler successor) { // 設置下一個處理者
         this.successor = successor;
     }

     public abstract void HandlerRequest(int request); // 請求處理邏輯

}

public class ConcreteHandler1 extends Handler {

    @Override
    public void HandlerRequest(int request) {
        if (request >= 0 && request <= 10) {
            System.out.println("ConcreteHandler1 處理0到10的請求 request = " + request);
        } else {
            successor.HandlerRequest(request); // 將請求發送給下一位
        }
    }
}

public class ConcreteHandler2 extends Handler {

    @Override
    public void HandlerRequest(int request) {
        if (request > 10 && request <= 20) {
            System.out.println("ConcreteHandler2 處理10到20的請求 request = " + request);
        } else {
            successor.HandlerRequest(request); // 將請求發送給下一位
        }
    }
}

public class ConcreteHandler3 extends Handler {

    @Override
    public void HandlerRequest(int request) {
        if (request > 20 && request <= 50) {
            System.out.println("ConcreteHandler3 處理10到20的請求 request = " + request);
        } else {
            System.out.println("無法處理的請求 request = " + request);
        }
    }
}

public class Test {

    public static void main(String[] args) {

        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();
		// 設置責任鏈的下家
        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handler3);

        int[] request = {2,4,3,6,20,10,40,3015,19,63,84};

        for (int i : request) {
            handler1.HandlerRequest(i);
        }

    }
}

測試結果

ConcreteHandler1 處理0到10的請求 request = 2
ConcreteHandler1 處理0到10的請求 request = 4
ConcreteHandler1 處理0到10的請求 request = 3
ConcreteHandler1 處理0到10的請求 request = 6
ConcreteHandler2 處理10到20的請求 request = 20
ConcreteHandler1 處理0到10的請求 request = 10
ConcreteHandler2 處理10到20的請求 request = 15
ConcreteHandler3 處理10到20的請求 request = 30
ConcreteHandler3 處理10到20的請求 request = 40
ConcreteHandler2 處理10到20的請求 request = 19
無法處理的請求 request = 63
無法處理的請求 request = 84
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章