管道模式

设计模式-责任链模式变体之管道模式 一.管道模式的定义   管道模式(Pipeline Pattern) 是责任链模式(Chain of Responsibility Pattern)的常用变体之一。在管道模式中,管道扮演着流水线的角色,将数据传递到一个加工处理序列中,数据在每个步骤中被加工处理后,传递到下一个步骤进行加工处理,直到全部步骤处理完毕(比如电子厂里原材料通过流水线工人一个一个加工最后组装成一个完整的电子产品)。   注:责任链模式只有一个处理器会处理数据,而管道模式是多个处理器会处理 二.什么情况下使用管道模式   任务代码较为 阅读详情

引言

学习了tomcat,对其中各个组件加载的顺序有一定的了解。Tomcat是根据管道模式来设计加载器的。为什么要使用管道模式?在一个大型的系统中,如果要对一个复杂的处理逻辑进行修改的话则是牵一发动全身,使得整个系统看起来没有可扩展性和重用性。
一种解决方法是将整个流程处理进行详细的划分,划分出来的小模块相互独立并且各自处理一段逻辑,这些逻辑的输出作为下一个逻辑的输入,这样一来只要针对摸个模块进行功能上的修改就可以了。这样的模式成为管道模式,也是tomcat上使用的模式。

何为管道模式

顾名思义,管道模式就是用一条管道将多个对象连接起来,管道与管道之间用阀门连接起来,而处理的逻辑也是在阀门上。待处理的对象进入管道后,首先经过阀门一,阀门二最后到基础阀门(basic value)。阀门的执行顺序为添加顺序,因为阀门的数据结构是list,先进先出。
管道描述

管道的调用方法

管道的调用方法是通过Value接口来定义阀门的调用。由于阀门之间是通过List来连接所以一个阀门到另一个阀门需要通过next方法来调用下一个阀门;而Pipeline接口定义了操作阀门的方法,包括获取第一个阀门、添加删除阀门、获取基础阀门等。
阀与管道的描述

管道模式举例

  • 阀门接口
public interface Value{
    public Value getNext();
    public void setNext(Value value);
    public void invoke(String string);
}
  • 管道接口
public interface Pipeline{
    public Value getFirst();
    public Value getBasic();
    public void setBasic(Valve valve);
    public void addValve(Valve valve);
}
  • 基础阀门
    将传入的字符串中的“aa”转化成”bb”
public class BasicValue implements Value{
    protected Value next = null;
    public Value getNext(){
        return next;
    }

    public void invoke(String handing){
        handing  = handing.replaceAll("aa","bb");
        System.out.println("基础阀门处理完后:"+handing);
    }
    public void setNext(Value value){
        this.next = value;
    }

}
  • 第二个阀门,将传入的字符串中的”11”转换成”22”
public class SecondValve implements Valve {
    protected Valve next = null; 
    public Valve getNext() {
        return next;
    }
    public void invoke(String handling) {
        handling = handling.replaceAll("11", "22");
        System.out.println("Second阀门处理完后:" + handling);
        getNext().invoke(handling);
    }
    public void setNext(Valve valve) {
        this.next = valve;
    }
}
  • 第三个阀门
    将传入的字符串中”zz”替换成”yy”
public class ThirdValve implements Valve {
    protected Valve next = null; 
    public Valve getNext() {
        return next;
    }
    public void invoke(String handling) {
        handling = handling.replaceAll("zz", "yy");
        System.out.println("Third阀门处理完后:" + handling);
        getNext().invoke(handling);
    }
    public void setNext(Valve valve) {
        this.next = valve;
    }
}
  • 管道
    根据默认规定,首先向管道中添加基础阀,再按顺序添加其他阀;阀门的执行顺序为先进先出,基础法最后执行
public class StandardPipeline implements Pipeline {
    protected Valve first = null; 
    protected Valve basic = null; 
    public void addValve(Valve valve) {
        if (first == null) {
            first = valve;
            valve.setNext(basic);
        } else {
            Valve current = first;
            while (current != null) {
                if (current.getNext() == basic) {
                    current.setNext(valve);
                    valve.setNext(basic);
                    break;
                }
                current = current.getNext();
            }
        }
    }
    public Valve getBasic() {
        return basic;
    }
    public Valve getFirst() {
        return first;
    }
    public void setBasic(Valve valve) {
        this.basic = valve;
    }
}
  • 测试类
public class Main {
    public static void main(String[] args) {
        String handling="aabb1122zzyy";
        StandardPipeline pipeline = new StandardPipeline();
        BasicValve basicValve = new BasicValve();
        SecondValve secondValve = new SecondValve();
        ThirdValve thirdValve = new ThirdValve();
        pipeline.setBasic(basicValve);
        pipeline.addValve(secondValve);
        pipeline.addValve(thirdValve);
        pipeline.getFirst().invoke(handling);
    }
}

测试结果:
Second阀门处理完后:aabb2222zzyy
Third阀门处理完后:aabb2222yyyy
基础阀门处理完后:bbbb2222yyyy
这就是管道模式,在管道中连接一个或多个阀门,每个阀门负责一部分逻辑处理,数据按规定的顺序往下流。此模式分解了逻辑处理任务,可方便对某任务单元进行安装拆卸,提高了流程的可扩展性、可重用性、机动性、灵活性。

Pipeline模型在QT中的实现 Pipeline 实践 阅读详情

相关推荐

redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持

redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持Redis在3.0版正式引入了集群这个特性,扩展变得非常简单。然而当你开心的升级到3.0后,却发现有些很好用的功能现在工作不了了, 比如我们今天要聊的pipeline功能。 我们知道,普通的情况下,redis client与server之间采用的是请求应答的模式,即: Client: command1

youaremoon的专栏 5万+

手撸设计模式之-管道模式

手撸设计模式之管道模式

以梦为马,不负韶华 1412

管道模式与过滤器模式区别

首先,管道模式(Pipeline Pattern)是一种责任链模式(Chain of Responsibility Pattern)的变体,它将数据传递到一个加工处理序列中,每个步骤对数据进行加工处理后,再传递到下一个步骤进行进一步处理,直到全部步骤处理完毕。这种模式主要用于将复杂的进程分解成多个独立的子任务,像流水线一样去执行。管道模式关注的是数据的顺序处理和逐步转换,确保数据按照预定义的步骤依次通过每个处理阶段。

学海无涯 1043

设计模式——管道模式(一)

管道模式(Pipeline Pattern) 是 责任链模式(Chain of Responsibility Pattern)的常用变体之一。在管道模式中,管道扮演着流水线的角色,将数据传递到一个加工处理序列中,数据在每个步骤中被加工处理后,传递到下一个步骤进行加工处理,直到全部步骤处理完毕。 PS:纯的责任链模式在链上只会有一个处理器用于处理数据,而管道模式上多个处理器都会处理数据。 何时使用管道模式 任务代码较为复杂,需要拆分为多个子步骤时,尤其是后续可能在任意位置添加新的子步骤、删除旧的子步

meser88的博客 5367

设计模式——管道模式

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 概念 我们把特定的业务,比如订单业务中的临时订单、订单提交以及订单支付等,抽象成一组Pipeline(管道); 拿生成临时订单业务来说,执行流程包括:1参数校验->2业务数据校验->3业务处理,这里的三段子流程是严格按照顺序执行的,我们用Valve(阀门)定义它们,每一个子流程即一个Valve; 在管道模...

jishulaozhuanjia的博客 2983

管道模式(pipeline)

读tomcat源码时碰到管道模式(PiepeLine),整个阀门的结构类似一个单链表,在处理数据需要在各个部件中流动处理的场景时非常有用,其原理如下: 流水线模式的几个角色 阀门 处理数据的节点管道 组织各个阀门客户端 构造管道,并调用 接口代码建模 阀门接口 public interface Valve { public Valve getNext();

fadetoblackfff的专栏 5371

基于 Spring 实现管道模式的最佳实践

本篇为设计模式第二篇,第一篇可见设计模式最佳套路 —— 愉快地使用策略模式管道模式(Pipeline Pattern)是责任链模式(Chain of Responsibility Pa...

淘系技术 2万+

管道设计模式、责任链模式、单例模式

压缩包里是我自己写的管道模式、单例模式的代码;你需要copy到你自己eclipse建的工程文件中。另外,我把我的代码说明,写在了readme.txt文件里,偷懒以及求快的人看看...如果有问题,可留言。另外我分数高,但绝对有保证!

深入责任链模式:案例解读及管道模式延伸

责任链在实际开发中的应用还是比较多的,特别是在营销订购系统、审核流转换处理、任务流程处理系统等系统中,其实我们在开发中往往主要应用的主要无非是以下三个场景(起码以我的平时开发的角度来看):一是无需太关心责任链中各处理流的顺序的简单使用;二是需要关注处理顺序,按责任链条延续处理,每个处理节点均可对请求进行节点的处理, 或将其传递给链上的下个处理节点;三是在处理中和纯的责任链模式在链上只会有一个处理器用于处理业务数据存在差异,需要进行管道模式采用多个处理器都会处理业务数据。针对以上场景进行业务举例和代码书写

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

SLAM轨迹评估神器evo实战:从GPS到TUM格式的完整转换指南(附Python代码)

本文详细介绍了如何使用evo工具将GPS数据转换为TUM格式,以便进行SLAM轨迹评估。通过Python代码实现GPS到笛卡尔坐标的精确转换,并提供了完整的处理流程和实战案例,帮助开发者轻松完成从原始GPS数据到精确轨迹评估的全过程。特别适用于ORB-SLAM等视觉SLAM算法的性能验证。

weixin_29074295的博客 294

什么是管道模式以及管道模式的优点

今天 朋友分享了一下管道模式,个人觉着这个模式挺好的。方便以后的扩展。且不影响之前代码的重用性,互不影响。简单总结一下。 管道模式用于将复杂的进程分解成多个独立的子任务。每个独立的任务都是可复用的,因此这些任务可以被组合成复杂的进程。 这种模式允许你将庞大的进程分解成更小的子任务,这些子任务将数据进行处理并将处理后的结果传递给下一个子任务。就像流水线一样,有条不紊,从原料加工到成品,实现

lovely_1014的博客 7770

ZYNQ软件复位重启、程序跳转的实现方法(Multiboot)

目录一、增加FSBL的调试信息 一、增加FSBL的调试信息 启动过程的调试信息如下: Xilinx First Stage Boot Loader Release 2016.4 Jan 19 2020-10:35:00 Devcfg driver initialized Silicon Version 3.1 Boot mode is QSPI Single Flash Informat...

weixin_41922484的博客 2万+

Java设计模式 - 管道模式

管道模式使用有序的Stage(或者Handler)来顺序的处理一个输入值,每个处理过程被看做一个阶段。但是每一个阶段都以来上一个阶段的输出。如果不依赖上一个阶段的输出结果,那么使用责任链模式即可。责任链模式的每个处理器互相独立,不依赖别的处理器结构。做个比喻:管道模式可用看做是富士康流水线,每个环节都依赖上个环节的输出责任链模式类似于招标,下发任务,谁有能力谁处理,不需要关心其他人;当然设计模式肯定是可以混用的,都是使用两个模式也是OK的。

BASK2311的博客 2197

【项目实战】分布式日志系统 之 Exactly-once 语义:确保数据处理的精确性

在分布式系统的数据传输与处理中,是一种核心可靠性保障,其目标是确保数据“仅被处理一次”——既不重复(避免多次处理),也不遗漏(避免未处理)。与,二者共同保障数据处理的精确性。Exactly-once 语义是分布式系统中数据可靠性的高级目标,其核心通过“幂等设计”(解决重复问题)和“分布式事务”(解决原子性问题)实现。在实际应用中,常结合 At-Least-Once 语义与幂等性,或通过事务 API 与唯一 ID 去重的组合,平衡可靠性与系统性能。

奶爸的编程之路,也就一周冷个三天 167

从 30 天试用到企业级落地,2026 年学习和试用 SAP AI 的完整路线图

摘要:SAP AI产品体系存在试用版本与商业版本的边界模糊问题,需区分业务嵌入AI(如Joule)、开发者工具(SAP Build Code)和AI基础平台(Generative AI Hub)三个层级。建议学习路径:1)通过SAP Learning专区掌握理论框架;2)优先使用30天Generative AI Hub基础试用体验模型编排;3)结合90天BTP试用账户开发完整应用。特别注意免费计划已陆续停止,需以最新官方文档为准。开发者应重点关注AI如何与SAP技术栈(CAP、Fiori等)集成,而非单纯功

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 115

聊聊如何利用管道模式来进行业务编排

1、什么是管道模式管道模式不属于我们常说的23种设计模式中的一种,它可以看成是责任链模式的一种变体。所谓的管道模式用技术话来说,就是把数据传递给一个任务队列,由任务队列按次序依次对数据进行加工处理。2、什么样的场景适合用管道模式当业务流程比较复杂时,需要拆分成多个子步骤,且每个子步骤可以自由组合,替换,新增,删除的场景本文主要实现2种不同形式的管道模式,一种基于注解,编排步骤通过注解直接写在了执行器上,通过执行器去定位业务执行方法。另外一种是业务方法里面自己组合调用执行器。...

JHIII的博客 323

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1024

redis管道模式批量存取数据

redis管道模式批量存取数据 管道模式概述 java程序中,对redis操作时,会自动创建连接。如果不加特殊处理,每次操作redis,就会创建连接。当需要处理较大的数据量时,会花费大量时间创建连接,显然,效率低下。 管道模式,就是把一个连接作为管道,连接redis,在这个管道内,对redis进行操作(存取等)。就是创建一个连接,多次使用这个连接,能极大地提高生产效率。 批量存入redis #co...

造梦先森的博客 5087

054_小驰私房菜_Camx i2c读写相关备忘

Camera 对Ae、Af这些控制,实际都是,最终实际都是落实到hal下发相关的指令给驱动,那hal这边是怎么给驱动下发相关命令的呢?#小驰私房菜054# #Qcom Camx#可以参考看下下面相关代码内容。

149

【专栏目录】

🌟 深度学习工程师的终极武器库!本专栏深度解析近3年CV领域最前沿的YoloV8改进方案,每一种方法都经过实战验证,性能显著提升!🌟。

m0_47867638的博客 1万+

基于SpringBoot实现管道模式

基于SpringBoot实现管道模式

faker7的博客 925

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

PG的管道模式如何工作

PG的管道模式如何工作今天给大家介绍PG引入的一个很酷的特性--管道模式。什么是管道模式呢?管道模式允许应用程序发送查询,而不用读取先前发送查询的结果。一句话,它允许在单个网络事务中发送和...

帅的数说 536

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Tomcat的管道和阀
下一篇: SpringMVC小扎
甜甜大头菜
博客等级 码龄15年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值