過濾器模式

定義

過濾器模式(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請求】

源碼

Click here


總結

過濾器模式將多個互不耦合的標準組成連接成一個標準。若不使用過濾器模式,我們如果需要根據不同場景將數據根據不同條件去過濾,那麼我們需要在一個類中編寫一大串的if-else 代碼,而且不同場景的邏輯代碼耦合在同一個類中,不利於代碼維護,以及代碼複用。


很多框架用到過濾器模式,如tomcat的Filter,Druid數據統計的Filter

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章