原文地址: haifeiWu和他朋友們的博客
博客地址:www.hchstudio.cn
歡迎轉載,轉載請注明作者及出處,謝謝!
最近項目中遇到各種輸出數據監控,數據校驗等邏輯,一個個實現很是麻煩。項目是中途接手的,不是很熟悉,偶然一天發現項目中對 Filter 的使用擴展起來很是方便,所以,今天樓主來分享下,也為自己學習做個記錄。下面我們從三方面來闡述。
什么是 Filter
Filter 在設計模式里面被稱為責任鏈設計模式,顧名思義,我們可以在這條責任鏈上對一組數據做不同的處理。這種類型的設計模式屬於結構型模式,它結合多個標准來獲得單一標准。UML見下圖,
為什么要使用 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 ,根據具體業務有所不同。
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 來處理數據。
小結
本文中的代碼不能直接運行,只是提供一種寫代碼的思路,小伙伴遇到此種場景可以借鑒一下。