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