Filter 设计模式编码实践
原文地址: 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();//初始化kafkaif (logCenterType == Constant.LogcenterType.KAFKA){KafkaProducerHelper.init(Repository.getCityConfig().getCityId(), Repository.getSysConfig());log.info("初始化kafka");}}@Overridepublic 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 设计模式编码实践相关推荐
- java与模式pdf 闫宏_Java设计模式及实践.pdf下载
Java设计模式及实践.pdf下载 资料简介:本书向读者展示Java语言中更加智能化的编码实例.书中首先介绍面向对象编程(OOP)和函数式编程(FP)范式,然后描述常用设计模式的经典使用方法,并解释如 ...
- java安全编码实践总结
本文漏洞复现的基础环境信息:jdk版本:1.8 ,框架:springboot1.5,数据库:mysql5.6和mongodb3.6,个别漏洞使用到不同的开发框架会特别标注. 安全编码实践 Sql注入防 ...
- Kafka项目实战-用户日志上报实时统计之编码实践
1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践> 该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ...
- 安全编码实践:什么是安全编码标准?
安全编码实践和安全编码标准至关重要,因为高达90%的软件安全问题是由编码错误引起的. 在这里,我们将阐释什么是安全编码标准,哪些是您应该执行的安全编码实践,以及如何实施安全标准. 您的安全编码标准指南 ...
- 安全编码实践之二:跨站点脚本攻击防御
安全编码实践之二:跨站点脚本攻击防御 声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用. 文章来源:https://medium.com/bugbountywriteup/how-to-w ...
- 现代密码学—密码学基本编码实践 16进制向base64编码转换 等长16进制字符串异或 找出密钥并破解密文 python
实验地点:E楼III区503 实验时间:11.17 一.实验室名称:攻防实验室 二.实验项目名称:密码学基本编码实践 三.实验学时:6学时 四.实验原理: Base64是网络上最常见的用于传输8Bit ...
- Java 设计模式最佳实践:一、从面向对象到函数式编程
原文:Design Patterns and Best Practices in Java 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],采用译后 ...
- Java 设计模式最佳实践:1~5
原文:Design Patterns and Best Practices in Java 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN Java 译文集],采用译后编 ...
- 设计模式1实践-开篇
虽然设计模式在1980's 就被提出和应用,并在2000年后被引入国内,在开发者开始流行.但好像在我平时的学习和工作中感觉它并没有真正被大家接受并运用.只是在国外的开源软件中能见到运用模式设计的例子. ...
最新文章
- linux中如何查询端口被占用的情况
- python2和python3关系_升级python2至python3解决依赖关系
- Spring Cloud Stream 与 Kafka 整合
- idea springboot 发布webservice 发布服务_阿里云发布 Spring Boot 新脚手架,真香
- 智能门锁能实现哪些生活场景?
- MySQL优化四(优化表结构)
- 如何吧家庭网络从计算机去掉,3个简单电脑、路由器设置,迅速解决网络瓶颈提高家庭网络速度...
- 好用的linux连接工具
- 2019/07/08 分布式文件系统概述(01)
- 什么是DNS污染?DNS污染的解决方法
- uni-app 启动页控制
- matlab解符号高次方程,matlab解高次方程的问题
- workman用户组
- 医院挂号系统代码_智慧医院中心是怎样做的?分诊叫号系统如何正确使用!
- 惊!12306官网又现用户信息泄露?
- 免校准的电量计量芯片_技术 | 免校准电能计量芯片,让家电智能化更简单
- Arduino播放声音
- 如何在Visual Studio中自动格式化代码?
- 2PC、3PC、TCC
- 【RabbitMQ】消息应答--ack机制