Filter 設計模式編碼實踐

原文地址: haifeiWu和他朋友們的博客
博客地址:www.hchstudio.cn
歡迎轉載,轉載請註明做者及出處,謝謝!java

最近項目中遇到各類輸出數據監控,數據校驗等邏輯,一個個實現非常麻煩。項目是中途接手的,不是很熟悉,偶然一天發現項目中對 Filter 的使用擴展起來非常方便,因此,今天樓主來分享下,也爲本身學習作個記錄。下面咱們從三方面來闡述。
設計模式

什麼是 Filter

Filter 在設計模式裏面被稱爲責任鏈設計模式,顧名思義,咱們能夠在這條責任鏈上對一組數據作不一樣的處理。這種類型的設計模式屬於結構型模式,它結合多個標準來得到單一標準。UML見下圖,
Filter設計模式ide

爲何要使用 Filter

好處是顯而易見的,它使咱們的代碼將請求和處理分開。請求者能夠不知道是誰處理的,處理者能夠不用知道請求的全貌,二者解耦,提升系統的靈活性。從而咱們的代碼更加簡潔跟易於擴展,而不是機械重複的Ctrl+C,Ctrl+V。固然好處還有好多,樓主就不在這裏贅述了,感興趣的小夥伴自行Google。學習

怎麼用 Filter 項目中的代碼實現邏輯

定義 Filter 接口,接口中定義進行數據處理的方法。設計

public interface IDataHandlerFilter {

    void filter(DataPackage dataPackage);
}

統一數據發送端,將業務系統處理好的數據,統一發送到 kafka。固然咱們還能夠實現 Filter 對數據進行其餘處理。日誌

public class DataSendHandlerFilter implements IDataHandlerFilter {

    public static final Logger log = LogManager.getLogger(DataSendHandlerFilter.class);

    private int logCenterType;

    //數據源類型 0-實時數據 1-wifi數據
    private String resourceType = StringUtils.isBlank(Repository.getCityConfig().getResourceType()) ? "0" : Repository.getCityConfig().getResourceType();

    public DataSendHandlerFilter() {

        logCenterType = Repository.getSysConfig().getLogCenterType();

        //初始化kafka
        if (logCenterType == Constant.LogcenterType.KAFKA){
            KafkaProducerHelper.init(Repository.getCityConfig().getCityId(), Repository.getSysConfig());
            log.info("初始化kafka");
        }
    }

    @Override
    public void filter(DataPackage dataPackage) {

        GpsData gpsData = dataPackage.getTargetData();

        /*重複數據和時間格式錯誤數據不發送*/
        if (null != gpsData && !gpsData.isError() && logCenterType == Constant.LogcenterType.KAFKA) {
            if (gpsData.isGps()) {
                KafkaProducerHelper.sendData(gpsData.toGpsStr(resourceType));
            }

            if (gpsData.isStn()) {
                KafkaProducerHelper.sendData(gpsData.toStnStr(resourceType));
            }
        }
    }
}

設置系統要使用的 Filter ,根據具體業務有所不一樣。code

public class HanderFilterUtil {
    
    private static List<IDataHandlerFilter> list;

    /**
     * 這個是有前後順序的
     * @return
     */
    public static List<IDataHandlerFilter> getDefaultFilter(SysConfig sysConfig, CityConfig cityConfig){
        
        if (null == list){
            list = new ArrayList<>();
        }
        
        //默認提供接收日誌、重複校驗、時間格式校驗、屬性校驗、數據轉發過濾器
        list.add(new RepeatHandlerFilter());
        list.add(new DataLogHandlerFilter());
        list.add(new DataSendHandlerFilter());
        // ......
        return list;
    }
}

最後咱們經過調用 getDefaultFilter 方法來決定咱們系統中使用哪幾種 Filter 來處理數據。blog

小結

本文中的代碼不能直接運行,只是提供一種寫代碼的思路,小夥伴遇到此種場景能夠借鑑一下。接口

關注咱們

相關文章
相關標籤/搜索