什么是 Filter
Filter 在设计模式里面被称为责任链设计模式,顾名思义,我们可以在这条责任链上对一组数据做不同的处理。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。UML见下图,Filter设计模式
为什么要使用 Filter
好处是显而易见的,它使我们的代码将请求和处理分开。请求者可以不知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。从而我们的代码更加简洁跟易于扩展,而不是机械重复的Ctrl+C,Ctrl+V。当然好处还有好多,楼主就不在这里赘述了,感兴趣的小伙伴自行Google。
怎么用 Filter 项目中的代码实现逻辑
定义 Filter 接口,接口中定义进行数据处理的方法。
1 2 3 4 |
public interface IDataHandlerFilter {
void filter(DataPackage dataPackage);
}
|
统一数据发送端,将业务系统处理好的数据,统一发送到 kafka。当然我们还可以实现 Filter 对数据进行其他处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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 ,根据具体业务有所不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 来处理数据。
作 者:haifeiWu
原文链接:https://www.hchstudio.cn/article/2018/4008/