管道模式 流处理

article/2025/9/14 11:53:19

(一)介绍

管道这个名字源于自来水厂的原水处理过程。原水要经过管道,一层层地过滤、沉淀、去杂质、消毒,到管道另一端形成纯净水。我们不应该把所有原水的过滤都放在一个管道中去提纯,而应该把处理过程进行划分,把不同的处理分配在不同的阀门上,第一道阀门调节什么,第二道调节什么……最后组合起来形成过滤纯净水的管道。
这种处理方式实际上体现了一种分治(Divid and Conquer)思想,这是一种古老且非常有效的思想。接下来,我们来看管道模式的实际应用。

(二)链式管道

一个典型的管道模式,会涉及以下3个主要的角色。
(1)阀门:处理数据的节点。(2)管道:组织各个阀门。(3)客户端:构造管道并调用。
对应现实生活中的管道,我们一般使用一个单向链表数据结构作为来实现,如图所示。这也是链式管道区别于拦截器模式之处。其实在功能上,拦截器、管道、过滤器、责任链有类似之处,在实际工作中,我们可以根据具体情况灵活选用。
在这里插入图片描述
在这里插入图片描述
为了便于理解,我找了一个管道阀门的图,结合上图可以更加容易理解。

【1】管道和阀门的整体结构就类似于一个链表结构,其中阀门是链表中的节点
【2】管道中可以添加和删除阀门,阀门按照顺序依次进行处理
【3】阀门可以根据需要对管道输入进行过滤处理。

基于上面的分析,我们可以按照下面的步骤实现一个简单的链式管道。

(1)阀门接口

/*** 阀门接口** @author zhangyu* @date 2022/12/4**/
public interface Valve {/*** 获取下一个阀门节点*/Valve getNext();/*** 设置下一个阀门节点*/void setNext(Valve v);/*** 当前阀门处理逻辑*/void invoke(String s);}

(2)管道接口:

/*** 管道接口** @author zhangyu* @date 2022/12/4**/
public interface Pipeline {/*** 获取管道中的第一个阀门节点*/public Valve getHead();/*** 获取管道中的第一个尾部阀门节点*/public Valve getTail();/*** 设置管道中的第一个尾部阀门节点*/public void setTail(Valve v);/*** 为管道添加阀门节点*/public void addValve(Valve v);
}

2.创建阀门的基础实现

/*** 阀门的基础实现** @author zhangyu* @date 2022/12/4**/
public abstract class ValveBase implements Valve {public Valve next;public Valve getNext() {return next;}public void setNext(Valve v) {next = v;}public abstract void invoke(String s);
}

3.实现具体的阀门
普通阀门一:当前模拟实现的场景是将输入字符串中的11替换为first字符串

public class FirstValve extends ValveBase {public void invoke(String s) {s = s.replace("11", "first");System.out.println("FirstValve阀门处理后结果" + s);getNext().invoke(s);}
}

(2)普通阀门二::当前模拟实现的场景是将输入字符串中的22替换为second字符串

public class SecondValve extends ValveBase {@Overridepublic void invoke(String s) {s = s.replace("22", "second");System.out.println("SecondValve阀门处理后结果" + s);getNext().invoke(s);}
}

(3)尾阀门:

public class TailValve extends ValveBase {public void invoke(String s) {s = s.replace("33", "third");System.out.println("TailValve阀门处理后结果" + s);}
}

4.实现具体的管道

public class StandardPipeline implements Pipeline {protected Valve head;protected Valve tail;public Valve getHead() {return head;}public Valve getTail() {return tail;}public void setTail(Valve v) {tail = v;}/*** 往链表依次添加节点*/public void addValve(Valve v) {if (head == null) {// 如果链表为空则当前节点为头结点head = v;v.setNext(tail);} else {// 将当前节点添加依次添加到队列Valve current = head;while (current != null) {// 当前节点放入队列尾部,但是需要在tail尾结点前面if (current.getNext() == tail) {current.setNext(v);v.setNext(tail);break;}current = current.getNext();}}}
}

5.组装管道,实现客户端调用

public class Client {public static void main(String[] args) {String s = "11,22,33";System.out.println("原始输入 : " + s);StandardPipeline pipeline = new StandardPipeline();TailValve tail = new TailValve();FirstValve first = new FirstValve();SecondValve second = new SecondValve();// 设置管道尾部节点pipeline.setTail(tail);// 依次将节点加入至管道链表中pipeline.addValve(first);pipeline.addValve(second);// 从管道头部开始处理pipeline.getHead().invoke(s);}
}

6.执行客户端程序并输出结果
在这里插入图片描述

【完整代码】
Github代码


http://chatgpt.dhexx.cn/article/qV2RPdOW.shtml

相关文章

Flink流处理API大合集:掌握所有flink流处理技术,看这一篇就够了

大家好,我是百思不得小赵。 创作时间:2022 年 5 月 18 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入CSDN的第1172天。觉得有帮助麻烦&#x…

Python流处理

转自 :https://www.toutiao.com/a6589000256896107015/?tt_frommobile_qq&utm_campaignclient_share&timestamp1534156143&appnews_article&utm_sourcemobile_qq&iid40708017633&utm_mediumtoutiao_ios&group_id6589000256896107015 F…

Stream流式处理

Stream流的三类方法 获取Stream:流创建一条流水线,并把数据放到流水线上准备。 中间方法:流水线上的操作一次操作完毕之后,还可以继续进行其他操作。 终结方法:一个Stream流只能有一个终结方法是流水线上的最后一个操作。 生成Stream流的…

流数据处理与分析

环境 名称 版本 系统 Ubuntu 18.04.4 LTS 内存 7.5GiB 处理器 Intel Core i7-8565U CPU 1.80GHz *8 图形 Intel UHD Graphics(Whiskey Lake 3*8 GT2) GNOME 3.28.2 操作系统类型 64位 磁盘 251.0 GB Storm 2.1.0 Zookeeper…

流处理系统

文章目录 引言如何发送事件流流处理不可靠的时钟容错总结 引言 清楚数据的类型有助于我们设计一个性能更高,更有针对性的数据系统,比如在线系统,离线系统(批处理)。近实时系统(流处理)等等。比如说批处理系统&#xf…

流处理简介

一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。比如我们希望对一个包含整数的集合中筛选出所有的偶数,…

【节点流和处理流】

节点流和处理流 基本介绍 节点流可以从特定数据源读取数据,如FileReader、FileWriter处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一…

流数据处理

流数据处理strom 在2011年Storm开源之前,由于Hadoop的火红,整个业界都在喋喋不休地谈论大数据。Hadoop的高吞吐,海量数据处理的能力使得人们可以方便地处理海量数据。但是,Hadoop的缺点也和它的优点同样鲜明——延迟大&#xff0…

一. 流式处理简介

https://www.cnblogs.com/shenlanzhizun/p/6027042.html Java技术学习 https://www.itkc8.com 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助…

Kafka基础-流处理

1. 什么是流处理? 首先,让我们说一下什么是数据流(也称为事件流)?它是无边界数据集的抽象说法,无边界意味着无限且不断增长,因为随着时间的推移,新数据会不断地到来。 除了无边界的…

流处理基本介绍

1. 什么是流处理 一种被设计来处理无穷数据集的数据处理系统引擎 2. 流处理的几个概念 1. 无穷数据(Unbounded data):一种持续生成,本质上是无穷尽的数据集。它经常会被称为“流数据”。然而,用流和批次来定义…

Spark Streaming与流处理

一、流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中。应用程序根据需要查询数据或计算数据。这就是传统的静态数据处理架构。Hadoop 采用 HDFS 进行数据存储,采用 MapReduce 进行数据查询或分…

什么是流处理

流处理正变得像数据处理一样流行。流处理已经超出了其原来的实时数据处理的范畴,它正在成为一种提供数据处理(包括批处理),实时应用乃至分布式事务的新方法的技术。 1、什么是流处理? 流处理是不断合并新数据以计算结果…

嵌入式软件升级方法

一、U盘升级 1.在u盘根目录新建文件夹,命名为‘upgrade’ 2.将软件复制到upgrade文件夹中 3.将u盘插到嵌入式服务器usb口上,断电重启服务器 二、PC工具升级 1.打开PC工具,选中要升级的机器,点击‘素材管理’选项卡&#xff0c…

嵌入式软件架构设计之分层设计

关注、星标公众号,不错过精彩内容 整理:黄工 素材来源:网络 参考来源: https://blog.51cto.com/kenotu/1614390 在正规的项目开发中,项目往往是并行开发的,也就是说硬件设计、底层软件设计、应用软件设计等…

嵌入式系统软件层次结构

文章目录 嵌入式系统软件嵌入式系统软件的层次结构硬件抽象层 嵌入式操作系统嵌入式操作系统——WinCE嵌入式操作系统——VxWorks嵌入式操作系统——Linux嵌入式Linux OS的特点 嵌入式操作系统——uCOS嵌入式操作系统—— PalmOS其他嵌入式操作系统华为鸿蒙系统 嵌入式系统软件…

嵌入式软件开发必备知识体系

嵌入式软件开发学习路线 前言 本章节主要介绍嵌入式软件开发概念以及大致的学习知识点的范围 一、嵌入式软件是什么? 百度百科:嵌入式工程师是指具有C/C语言、汇编语言等基础,熟悉模拟电子技术等硬件知识,了解处理器体系结构&a…

嵌入式开发 | 嵌入式开发设计文档该怎么写?

关注星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 俗话说,不会写文档的工程师不是好的工程师! 如果你只会写代码,而从不写文档,迟早有一天会“出事”。这不是危言耸听,现实生活…

简单嵌入式系统软件架构

本文为原创,以下链接有比较及时的更新: https://www.yuque.com/docs/share/334f4a3d-2974-49db-8f68-4db6601a0d21?# 《简单嵌入式系统》 引言 本文描述的内容,适用范围是简单嵌入式系统。举一些可能不恰当的例子,如手环、蓝牙…

嵌入式软件设计层级划分概念

嵌入式软件设计层级划分概念 设计过程中体会的细化更新部分: 层级描述备注应用层直接控制应用,比如led_light_on(),led_light_off() 器件层(如果操作复杂可进一步划分为器件应用层和器件驱动层)比如:实现led_light_on …