设计模式:管道模式(Pipeline)
管道模式(Pipeline)不属于 GoF 提出的 23 种经典设计模式,但在工程中很常见。它与职责链模式相近,可看作其变体:数据/请求沿固定或可配置的处理阶段依次流动,每一阶段只做一类变换,再交给下一阶段。
模式定义
将复杂处理拆成多个独立、可组合的阶段(Stage / Handler / Pipe)。输入从管道一端进入,依次经过各阶段加工,从另一端得到输出。阶段之间通过统一的上下文或消息传递数据,彼此尽量解耦。
常见别名:流水线模式、Pipe-Filter(管道-过滤器)。
模式优缺点
优点
- 单一职责:每阶段只关心一种变换,易测、易替换。
- 可组合:增删、重排阶段即可改变流程,而不必改调用方。
- 便于并行/异步:部分流水线可对无依赖阶段做并行或背压控制(需额外设计)。
缺点
- 阶段过多时,调试与追踪成本上升(需统一日志/追踪上下文)。
- 若阶段间共享可变大对象,易出现隐蔽耦合与线程安全问题。
- 不适合强分支、强回退的复杂状态机(此时更宜用状态模式或工作流引擎)。
模式结构
包含角色
| 角色 | 职责 |
|---|---|
| Pipeline(管道) | 持有阶段列表,按序驱动执行,对外提供统一入口 |
| Stage / Handler(阶段) | 接收上下文,完成一步处理,再交给下一阶段 |
| Context / Payload(上下文) | 在阶段间传递的数据与中间状态 |
| Client(客户端) | 组装管道并提交初始输入 |
结构示意
1 | Client |
代码示例(Java 示意)
1 | public interface Stage { |
说明:上例为同步串行管道。Netty 的 ChannelPipeline、Servlet Filter Chain、编译器前后端流水线等,是同一思想在不同领域的实现。
相关的模式
| 模式 | 关系 |
|---|---|
| 职责链 | 最相近。职责链常强调「谁能处理谁接手、可能短路」;管道更强调「按序必经各阶段加工」。 |
| 装饰器 | 包装增强同一对象;管道是多个阶段依次变换数据流。 |
| 模板方法 | 固定算法骨架;管道把步骤外置为可插拔阶段列表。 |
| 观察者 | 事件广播;管道是单向、有序的数据加工链。 |
适用场景
- 请求处理:鉴权 → 限流 → 业务 → 审计 → 响应封装。
- ETL / 数据清洗:抽取 → 校验 → 转换 → 加载。
- 多媒体/编译:解码 → 滤镜 → 编码;词法 → 语法 → 优化 → 生成。
- 消息中间件消费:反序列化 → 校验 → 业务 → 确认。
应用示例
- **Netty
ChannelPipeline**:入站/出站 Handler 链式处理 ByteBuf 与业务消息。 - Servlet / Spring Filter:过滤器链对 HTTP 请求做横切处理。
- CI/CD Pipeline:构建 → 测试 → 扫描 → 部署各 Stage。
- Unix 管道:
cmd1 | cmd2 | cmd3,标准输出接到下一命令标准输入。
典型应用
在业务系统中,常把「下单」「支付回调」「内容审核」等流程配置成可编排管道,使规则变更只需增删 Stage,而不改核心交易代码。注意:若阶段间存在复杂补偿与回滚,需额外引入事务消息或 Saga,管道本身不解决分布式一致性。
相关参考
- The Pipeline Pattern for Fun and for Profit
- 腾讯云社区:管道模式相关讨论
- GoF《设计模式》:可对照「职责链」理解差异
设计模式:管道模式(Pipeline)
http://blog.gxitsky.com/2022/07/22/DesignPatterns-22-pipeline/

