原文地址: 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 来处理数据。

小结

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

Filter 设计模式编码实践的更多相关文章

  1. 后端开发实践系列之二——领域驱动设计(DDD)编码实践

    Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there are f ...

  2. 领域驱动设计(DDD)编码实践

    写在前面 Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there ...

  3. 后端开发实践系列之三——事件驱动架构(EDA)编码实践

    在本系列的前两篇文章中,笔者分别讲到了后端项目的代码模板和DDD编码实践,在本文中,我将继续以编码实践的方式分享如何落地事件驱动架构. 单纯地讲事件驱动架构(Event Driven Architec ...

  4. Kafka项目实战-用户日志上报实时统计之编码实践

    1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践>  该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ...

  5. ElasticSearch实战-编码实践

    1.概述 前面在<ElasticSearch实战-入门>中给大家分享如何搭建这样一个集群,在完成集群的搭建后,今天给大家分享如何实现对应的业务功能模块,下面是今天的分享内容,目录如下所示: ...

  6. Hadoop项目实战-用户行为分析之编码实践

    1.概述 本课程的视频教程地址:<用户行为分析之编码实践> 本课程以用户行为分析案例为基础,带着大家去完成对各个KPI的编码工作,以及应用调度工作,让大家通过本课程掌握Hadoop项目的编 ...

  7. 七、Kafka 用户日志上报实时统计之编码实践

    一.数据生产实现 1.配置数据生产模块 项目基础配置所包含的内容,如下所示: •项目工程的文件配置 •集群连接信息配置 •开发演示 2.实现 Flume 到 Kafka 模块 实现 Flume 到 K ...

  8. [Shell]bash的良好编码实践

    最好的bash脚本不仅可以工作,而且以易于理解和修改的方式编写.很多好的编码实践都是来自使用一致的变量名称和一致的编码风格.验证用户提供的参数是否正确,并检查命令是否能成功运行,以及长时间运行是否能保 ...

  9. ES6 | ES6新语法 在编码实践中的应用

    本章探讨如何将 ES6 的新语法,运用到编码实践之中,与传统的 JavaScript 语法结合在一起,写出合理的.易于阅读和维护的代码. 多家公司和组织已经公开了它们的风格规范,本文的内容主要参考了  ...

随机推荐

  1. [ 原创 ] Linux下查找指定类型文件以及删除

    find ./ -name "*.lok"   // 查找文件find ./ -name "*.lok" |xargs rm -fr  // 查找文件并删除

  2. shell 中可以for 循环的时间加减日期格式

    ..};do # LAST_HOUR=`date -d '-${num} hour' +%H` 不可for循环,报格式错误 LAST_HOUR=`date "+%H" -d -${ ...

  3. Python列表的生成

    要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11): >>> range(1, 11) [1, 2, 3, 4, 5, ...

  4. inline-block元素出现位置错位的解决方法

    如下代码所示: <div class="container"> <div style="display: inline-block; height: 1 ...

  5. HTML标签及属性

    HTML 标签大全及属性  来源:http://www.cnblogs.com/Mr-liyang/p/5797976.html 基本结构标签:<HTML>,表示该文件为HTML文件< ...

  6. 钉钉开发笔记(三)MySQL的配置

    最近在编写web的过程中,经常需要与后台工作人员互动.由于比较麻烦.没有效率. 就果断的请教了,公司的后台大牛,学习下数据库的一些简单操作,现在就把利用MySQL连接服务器, 进行可视化操作的简单步骤 ...

  7. 通过snmp监控linux

    一.linux snmpd安装 yum install -y net-snmp net-snmp-utils 二.snmp的配置(vim /etc/snmp/snmpd.conf) com2sec n ...

  8. 集合_java集合框架

    转载自http://blog.csdn.net/zsw101259/article/details/7570033 Java集合框架图 简化图: Java平台提供了一个全新的集合框架.“集合框架”主要 ...

  9. OpenCV之设计模式

    参考资料: http://hahack.com/codes/opencv-and-mvc/ http://blog.csdn.net/yzhang6_10/article/details/508084 ...

  10. archives of source

    "ubuntu 暂时不能解析域名 archive.ubuntu.com"怎么办? root下输入命令:lsb_release -a用来查询Ubuntu版本号 登录网站 http:/ ...