鏈式調用

不少文章都是先告訴你概念在舉例,其實效果並很差。畢竟我連東西都每見過,你就開始告訴我,它有什麼特色,有何做用等等。bash

因此我決定,先給大家看實例,讓你先有一個大概認識,等講到概念的時候,再對照着實例去作驗證,這樣印象應該深入一些ide

實例

節點

/**
 * 這是執行鏈的處理節點
 */
public abstract class Handler {

    /**
     * execute 與 執行鏈中的process 相互調用,不斷循環,直到執行到最後一個節點
     *
     * @param chain 執行鏈
     */
    public void execute(Chain chain) {
        // 先執行當前節點的處理方法
        process();
        // 在執行 執行鏈 中的 process
        chain.process();
    }

    /**
     * process 是該節點的 處理方法
     * 執行鏈的每個節點都要重寫 process 方法,並在裏面寫上本身的處理邏輯
     */
    abstract void process();
}
複製代碼

執行鏈

/**
 * 執行鏈
 */
public class Chain {

    // 節點列表,裏面是要執行的節點
    private List<Handler> list;

    // 遊標,指向要執行的節點,默認從0開始
    private int index = 0;

    // 構造方法,傳人一個 節點列表
    public Chain(List<Handler> list) {
        this.list = list;
    }

    /**
     * 按照順序執行節點列表中的節點
     * process 與 節點的execute方法 相互調用,不斷循環,直到執行到最後一個節點
     */
    public void process() {
        // 節點列表是否爲null 或者 遊標已經走完了最後一個節點
        if (list == null || index >= list.size()) {
            return;
        }
        //執行順序 1獲取遊標指向的節點 2遊標+1 3執行節點的execute方法,並將本身傳遞進去
        list.get(index++).execute(this);
    }
}
複製代碼

測試類

public class Test {

    /**
     * 這是節點A,它重寫了節點的process方法
     */
    static class HandlerA extends Handler {

        @Override
        protected void process() {
            System.out.println("執行HandlerA的命令");
        }
    }

    /**
     * 這是節點B,它重寫了節點的process方法
     */
    static class HandlerB extends Handler {

        @Override
        protected void process() {
            System.out.println("執行HandlerB的命令");
        }
    }

    /**
     * 這是節點C,它重寫了節點的process方法
     */
    static class HandlerC extends Handler {

        @Override
        protected void process() {
            System.out.println("執行HandlerC的命令");
        }
    }


    public static void main(String[] args) {
        /**
         * 建立一個節點列表,並按照執行順序添加節點對象
         */
        List<Handler> list = Arrays.asList(
                new HandlerA(),
                new HandlerB(),
                new HandlerC()
        );
        // 根據 節點列表 初始化一個 執行鏈
        Chain chain = new Chain(list);
        //調用
        chain.process();
    }
}
複製代碼

概念

上面的例子就是 Spring AOP 處理多個切面做用同一個目標方法的實現。 其實就是切面1調用切面2,切面2調用切面3...切面n調用目標方法。測試

組成

鏈式調用 主要有兩個類ui

  • 節點抽象類
  • 執行鏈類

任何一個點節點類都必須繼承節點抽象類並重寫要執行的方法 執行鏈類須要一個節點列表來告訴它執行順序 執行鏈 與 節點相互調用,不斷循環,直到最後一個節點(注意,這個地方要處理好,否則容易死循環)this

做用

按照 指定的前後順序,批量執行自定義的方法。spa

相關文章
相關標籤/搜索