天天看點

設計模式之美筆記 —— 職責鍊模式

設計模式之美 - 61

職責鍊模式的定義:将請求的發送和接收解耦,讓多個接收對象都有機會處理這個請求。将這些接收對象串成一條鍊,并沿着這條鍊傳遞這個請求,直到鍊上的某個接收對象能夠處理它為止。

多個處理器處理同一個請求,處理器A完成處理後,把請求交給處理器B,處理器B處理完成後,将請求處理給C,以此類推,鍊條上的每個處理器各自承擔各自的處理職責,是以叫作職責鍊模式。

Netty 架構在處理消息時使用的 Pipeline 就是一種責任鍊模式。

目錄

一、職責鍊有兩種方式:

二、職責鍊模式的代碼實作

三、職責鍊模式項目應用

四、架構中的過濾器,攔截器的實作

Servlet Filter :

Spring Interceptor:

一、職責鍊有兩種方式:

  1. 擷取到可處理請求的處理器處理完成後,終止處理鍊條
  2. 一個請求會走完整個處理鍊條的每一個處理節點

二、職責鍊模式的代碼實作

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,最後到達具體的業務代碼中。

繼續閱讀