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();
//初始化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 设计模式编码实践的更多相关文章
- 后端开发实践系列之二——领域驱动设计(DDD)编码实践
Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there are f ...
- 领域驱动设计(DDD)编码实践
写在前面 Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there ...
- 后端开发实践系列之三——事件驱动架构(EDA)编码实践
在本系列的前两篇文章中,笔者分别讲到了后端项目的代码模板和DDD编码实践,在本文中,我将继续以编码实践的方式分享如何落地事件驱动架构. 单纯地讲事件驱动架构(Event Driven Architec ...
- Kafka项目实战-用户日志上报实时统计之编码实践
1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践> 该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ...
- ElasticSearch实战-编码实践
1.概述 前面在<ElasticSearch实战-入门>中给大家分享如何搭建这样一个集群,在完成集群的搭建后,今天给大家分享如何实现对应的业务功能模块,下面是今天的分享内容,目录如下所示: ...
- Hadoop项目实战-用户行为分析之编码实践
1.概述 本课程的视频教程地址:<用户行为分析之编码实践> 本课程以用户行为分析案例为基础,带着大家去完成对各个KPI的编码工作,以及应用调度工作,让大家通过本课程掌握Hadoop项目的编 ...
- 七、Kafka 用户日志上报实时统计之编码实践
一.数据生产实现 1.配置数据生产模块 项目基础配置所包含的内容,如下所示: •项目工程的文件配置 •集群连接信息配置 •开发演示 2.实现 Flume 到 Kafka 模块 实现 Flume 到 K ...
- [Shell]bash的良好编码实践
最好的bash脚本不仅可以工作,而且以易于理解和修改的方式编写.很多好的编码实践都是来自使用一致的变量名称和一致的编码风格.验证用户提供的参数是否正确,并检查命令是否能成功运行,以及长时间运行是否能保 ...
- ES6 | ES6新语法 在编码实践中的应用
本章探讨如何将 ES6 的新语法,运用到编码实践之中,与传统的 JavaScript 语法结合在一起,写出合理的.易于阅读和维护的代码. 多家公司和组织已经公开了它们的风格规范,本文的内容主要参考了 ...
随机推荐
- 转:devise使用
1.gem install devise 2.在gemfile中添加 gem 'devise' 3.bundle install 4.执行 rails generate devise:install ...
- 【转】RocketMQ事务消费和顺序消费详解
RocketMQ事务消费和顺序消费详解 转载说明:该文章纯转载,若有侵权或给原作者造成不便望告知,仅供学习参考. 一.RocketMq有3中消息类型 1.普通消费 2. 顺序消费 3.事务消费 顺序消 ...
- [Python Study Notes]pynput实现对鼠标控制
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- Proxmox VE 设置备忘
现在PROXMOX 虚拟机一共两个(使用的是N3700 cpu的一个小机器主要为了省电.) 一个是ROS,经过折腾,IK8速度还不错就是资源占用比较大特比下载数据大时对CPU占用很大:OpenWRT不 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 10—Advice for applying machine learning 机器学习应用建议
Lecture 10—Advice for applying machine learning 10.1 如何调试一个机器学习算法? 有多种方案: 1.获得更多训练数据:2.尝试更少特征:3.尝试更多 ...
- Spark中RDD的常用操作(Python)
弹性分布式数据集(RDD) Spark是以RDD概念为中心运行的.RDD是一个容错的.可以被并行操作的元素集合.创建一个RDD有两个方法:在你的驱动程序中并行化一个已经存在的集合:从外部存储系统中引用 ...
- Hadoop Yarn Capacity Scheduler
Capacity 调度器配置 <property> <name>yarn.resourcemanager.scheduler.class<name> <val ...
- SpringBoot整合ActiveMQ快速入门
Spring Boot 具有如下特性: 为基于 Spring 的开发提供更快的入门体验 开箱即用,没有代码生成,也无需 XML 配置.同时也可以修改默认值来满足特定的需求. 提供了一些大型项目中常见的 ...
- Unity 之 Shader 面的剔除 Cull
面的剔除 Cull 在渲染的时候,默认情况下是只有朝向摄像机的面才会被渲染,可以告诉Unity,我想渲染哪一个朝向的面,使用Cull命令在计算体积阴影的时候会用到对Cull的操作来计算和物体相交的投影 ...
- cs api 之一
无法创建 无法创建网络 执行顺序