博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Filter 设计模式编码实践
阅读量:6938 次
发布时间:2019-06-27

本文共 2236 字,大约阅读时间需要 7 分钟。

原文地址:

博客地址:
欢迎转载,转载请注明作者及出处,谢谢!

最近项目中遇到各种输出数据监控,数据校验等逻辑,一个个实现很是麻烦。项目是中途接手的,不是很熟悉,偶然一天发现项目中对 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
list; /** * 这个是有先后顺序的 * @return */ public static List
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 来处理数据。

小结

本文中的代码不能直接运行,只是提供一种写代码的思路,小伙伴遇到此种场景可以借鉴一下。

关注我们

你可能感兴趣的文章
grafana 监控模板监控系统启动时间
查看>>
2014对自己的规划
查看>>
Ajax简单示例应用,一看就会用!
查看>>
我的友情链接
查看>>
hbase的预region分区 脚本 经典
查看>>
我的友情链接
查看>>
Firefox 52 发大招:正式支持 TLS 1.3
查看>>
Django之单元测试
查看>>
Exchange Server 内部版本号和发行日期汇总
查看>>
2015.10.10信息系统项目管理师作业
查看>>
我的友情链接
查看>>
mrtg流量波动大
查看>>
Java8-Stream-终止操作-归约与收集
查看>>
IOS 常用的设计模式
查看>>
spring boot(一):入门篇
查看>>
ext-js当用blur()和focus()来控制焦点
查看>>
测试网线需要注意的地方
查看>>
如何查看linux版本 如何查看LINUX是多少位
查看>>
hibernate cp30和dbcp配置加jidn配置
查看>>
学习雷锋,与爱同行
查看>>