定義
過濾器模式(Intercepting Filter Pattern),又稱標準模式(Criteria Pattern),主要用於統一接收並過濾客戶端的請求,根據過濾器的選擇,將請求傳送給對應的目標處理程序。
過濾器模式屬於對象結構型模式。
要點
主要角色:
目標對象(Target):處理請求,根據要求執行任務。
過濾器(Filter):過濾器在請求處理程序執行請求之前或之後,執行某些任務。
過濾器鏈(Filter Chain):過濾器鏈帶有多個過濾器,並在 Target 之前按照定義的順序執行這些過濾器。
過濾管理器(Filter Manager):過濾管理器管理過濾器和過濾器鏈。
場景
某應用WEB場景下,一個客戶的WEB請求需要經過授權檢查和規範檢查,符合全部條件時纔會處理該客戶的請求。
實現
Target
/**
* 目標類
*/
public class Target {
public void processingRequest(String request) {
System.out.println("目標對象處理請求:" + request);
}
}
Filter
/**
* 過濾器接口
*/
public interface Filter {
void execute(String request);
}
AuthenticationFilter
/**
* 過濾器實現類A
*/
public class AuthenticationFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("授權檢查:" + request);
}
}
SpecificationFilter
/**
* 過濾器實現類B
*/
public class SpecificationFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("規範檢查:" + request);
}
}
FilterChain
/**
* 過濾器鏈
*/
public class FilterChain {
/**
* 過濾器
*/
private List<Filter> filters;
/**
* 目標對象
*/
private Target target;
public FilterChain() {
filters = new ArrayList<>();
}
public void addFilter(Filter filter) {
filters.add(filter);
}
public void setTarget(Target target) {
this.target = target;
}
public void execute(String request) {
// 過濾請求
for (Filter filter : filters) {
filter.execute(request);
}
// 目標對象處理請求
target.processingRequest(request);
}
}
FilterManager
/**
* 過濾器管理
*/
public class FilterManager {
private FilterChain filterChain;
public FilterManager(Target target) {
this.filterChain = new FilterChain();
this.filterChain.setTarget(target);
}
public void addFilter(Filter filter) {
filterChain.addFilter(filter);
}
public void filterRequest(String request) {
filterChain.execute(request);
}
}
Client
public class Client {
public static void main(String[] args) {
sendRequest();
}
private static void sendRequest() {
FilterManager filterManager = new FilterManager(new Target());
filterManager.addFilter(new AuthenticationFilter());
filterManager.addFilter(new SpecificationFilter());
filterManager.filterRequest("【@Request:這裏是一個WEB請求】");
}
}
-----------------輸出----------------
授權檢查:【@Request:這裏是一個WEB請求】
規範檢查:【@Request:這裏是一個WEB請求】
目標對象處理請求:【@Request:這裏是一個WEB請求】
源碼
總結
過濾器模式將多個互不耦合的標準組成連接成一個標準。若不使用過濾器模式,我們如果需要根據不同場景將數據根據不同條件去過濾,那麼我們需要在一個類中編寫一大串的if-else 代碼,而且不同場景的邏輯代碼耦合在同一個類中,不利於代碼維護,以及代碼複用。
很多框架用到過濾器模式,如tomcat的Filter,Druid數據統計的Filter