前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Filter 设计模式编码实践

Filter 设计模式编码实践

作者头像
haifeiWu
发布2018-10-10 10:34:59
3940
发布2018-10-10 10:34:59
举报

作 者:haifeiWu 原文链接:https://cloud.tencent.com/developer/article/1352512 版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

最近项目中遇到各种输出数据监控,数据校验等逻辑,一个个实现很是麻烦。项目是中途接手的,不是很熟悉,偶然一天发现项目中对 Filter 的使用扩展起来很是方便,所以,今天楼主来分享下,也为自己学习做个记录。下面我们从三方面来阐述。

什么是 Filter

Filter 在设计模式里面被称为责任链设计模式,顾名思义,我们可以在这条责任链上对一组数据做不同的处理。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

怎么用 Filter 项目中的代码实现逻辑

定义 Filter 接口,接口中定义进行数据处理的方法。

代码语言:javascript
复制
public interface IDataHandlerFilter {

	void filter(DataPackage dataPackage);
}

统一数据发送端,将业务系统处理好的数据,统一发送到 kafka。当然我们还可以实现 Filter 对数据进行其他处理。

代码语言:javascript
复制
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 ,根据具体业务有所不同。

代码语言:javascript
复制
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://cloud.tencent.com/developer/article/1352512

版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 Filter
  • 怎么用 Filter 项目中的代码实现逻辑
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档