責任鏈模式
- 描述
- 基本使用
- 使用
描述
如果一個請求要經過多個類似或相關處理器的處理。
可以考慮將這些處理器添加到一個鏈上,讓請求逐個經過這些處理器進行處理。
通常,在一個業務場景下會對整個責任鏈進行初始化,確定這個鏈上有哪些Handler
關于一個handler處理請求后,請求如何流轉通常有幾種處理方式:
- handler有匹配條件
- 一旦匹配一個handler完成處理后直接返回 后續handler 不會處理i請求
- 無論是否匹配都執行完整個責任鏈
- handler沒有匹配條件
- 這種沒有匹配條件的鏈通常是執行整個責任鏈
基本使用
這里以有條件匹配,只執行一個handler后就返回的方式舉例
匹配的條件通常包含在請求參數中,用于與每個Handler內條件匹配
這里參數就簡單定義一個類,不提抽象層了
- 請求參數
public class HandleRequest {private String type;private Object data;public String getType() {return type;}public void setType(String type) {this.type = type;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}@Overridepublic String toString() {return "HandleRequest{" +"type='" + type + '\'' +", data=" + data +'}';}
}
- 抽象Handler
public abstract class AbstractHandler {private AbstractHandler nextHandler;public final void handleRequest(HandleRequest request) {if (Objects.equals(handleType(), request.getType())) {this.handle(request);} else {if (this.nextHandler != null) {this.nextHandler.handleRequest(request);} else {System.out.println("請求未匹配到Handler...");}}}public void setNext(AbstractHandler handler) {this.nextHandler = handler;}protected abstract String handleType();protected abstract void handle(HandleRequest request);
}
- 具體Handler
public class HandlerA extends AbstractHandler {@Overrideprotected String handleType() {return "typeA";}@Overrideprotected void handle(HandleRequest request) {System.out.println("HandlerA 處理請求: " + request);}
}public class HandlerB extends AbstractHandler {@Overrideprotected String handleType() {return "typeB";}@Overrideprotected void handle(HandleRequest request) {System.out.println("HandlerB 處理請求: " + request);}
}
使用
在實際使用中,可以將責任鏈的初始化動作放到具體業務類中,返回第一個Handler給調用者即可
然后將請求委托給責任鏈。
這里就直接在調用方 進行初始化
public class Sample {public static void main(String[] args) {AbstractHandler handlerA = new HandlerA();AbstractHandler handlerB = new HandlerB();handlerA.setNext(handlerB);HandleRequest request = new HandleRequest();request.setType("typeB");request.setData("data.....");handlerA.handleRequest(request);}
}