設計模式之美 - 61
職責鍊模式的定義:将請求的發送和接收解耦,讓多個接收對象都有機會處理這個請求。将這些接收對象串成一條鍊,并沿着這條鍊傳遞這個請求,直到鍊上的某個接收對象能夠處理它為止。
多個處理器處理同一個請求,處理器A完成處理後,把請求交給處理器B,處理器B處理完成後,将請求處理給C,以此類推,鍊條上的每個處理器各自承擔各自的處理職責,是以叫作職責鍊模式。
Netty 架構在處理消息時使用的 Pipeline 就是一種責任鍊模式。
目錄
一、職責鍊有兩種方式:
二、職責鍊模式的代碼實作
三、職責鍊模式項目應用
四、架構中的過濾器,攔截器的實作
Servlet Filter :
Spring Interceptor:
一、職責鍊有兩種方式:
- 擷取到可處理請求的處理器處理完成後,終止處理鍊條
- 一個請求會走完整個處理鍊條的每一個處理節點
二、職責鍊模式的代碼實作
1、使用模闆模式,實作一個抽象處理器父類(Handler),裡面包含抽象方法doHandle(),每一個具體是處理器類(HanlderA,HandlerB)實作自己的處理邏輯。
2、通過一個連結清單存放處理器,作為處理器鍊(HandlerChain),也可采用資料來存儲處理器類,更簡單
3、通過handle()方法,實作處理類處理請求後可決定是否終端鍊條
// 抽象處理器父類
public abstract class Handler {
protected Handler successor = null;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
// 共用邏輯,控制節點執行完成是否退對外連結條
public final void handle1() {
boolean handled = doHandle();
if (successor != null && !handled) {
successor.handle();
}
}
// 共用邏輯,每個請求都會走完鍊條的所有節點
public final void handle2() {
doHandle();
if (successor != null) {
successor.handle();
}
}
// 子類所需重寫的模闆方法
protected abstract boolean doHandle();
}
public class HandlerA extends Handler {
@Override
protected boolean doHandle() {
boolean handled = false;
//...
return handled;
}
}
public class HandlerB extends Handler {
@Override
protected boolean doHandle() {
boolean handled = false;
//...
return handled;
}
}
public class HandlerChain {
private Handler head = null;
private Handler tail = null;
public void addHandler(Handler handler) {
handler.setSuccessor(null);
if (head == null) {
head = handler;
tail = handler;
return;
}
tail.setSuccessor(handler);
tail = handler;
}
public void handle() {
if (head != null) {
head.handle();
}
}
}
// 使用舉例
public class Application {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
chain.handle();
}
}
三、職責鍊模式項目應用
在場景化查詢過程中,對于傳回結果中的資訊進行脫敏
四、架構中的過濾器,攔截器的實作
設計模式之美 - 63
Servlet Filter :
可以攔截http請求,進行相關的限流,鑒權等操作。
Servlet Filter 是 Servlet 規範的一部分,實作依賴于 Web 容器
Spring Interceptor:
Spring Interceptor 是 Spring MVC 架構的一部分,由 Spring MVC 架構來提供實作。
用戶端發送的請求,會先經過 Servlet Filter,然後再經過 Spring Interceptor,最後到達具體的業務代碼中。