设计模式:管道模式(Pipeline)

管道模式(Pipeline)不属于 GoF 提出的 23 种经典设计模式,但在工程中很常见。它与职责链模式相近,可看作其变体:数据/请求沿固定或可配置的处理阶段依次流动,每一阶段只做一类变换,再交给下一阶段。

模式定义

将复杂处理拆成多个独立、可组合的阶段(Stage / Handler / Pipe)。输入从管道一端进入,依次经过各阶段加工,从另一端得到输出。阶段之间通过统一的上下文或消息传递数据,彼此尽量解耦。

常见别名:流水线模式、Pipe-Filter(管道-过滤器)。

模式优缺点

优点

  • 单一职责:每阶段只关心一种变换,易测、易替换。
  • 可组合:增删、重排阶段即可改变流程,而不必改调用方。
  • 便于并行/异步:部分流水线可对无依赖阶段做并行或背压控制(需额外设计)。

缺点

  • 阶段过多时,调试与追踪成本上升(需统一日志/追踪上下文)。
  • 若阶段间共享可变大对象,易出现隐蔽耦合与线程安全问题。
  • 不适合强分支、强回退的复杂状态机(此时更宜用状态模式或工作流引擎)。

模式结构

包含角色

角色 职责
Pipeline(管道) 持有阶段列表,按序驱动执行,对外提供统一入口
Stage / Handler(阶段) 接收上下文,完成一步处理,再交给下一阶段
Context / Payload(上下文) 在阶段间传递的数据与中间状态
Client(客户端) 组装管道并提交初始输入

结构示意

1
2
3
4
5
6
7
8
9
Client
│ submit(input)

Pipeline

├─ Stage1.process(ctx) ──► Stage2.process(ctx) ──► … ──► StageN.process(ctx)


output / ctx.result

代码示例(Java 示意)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public interface Stage {
void process(PipelineContext ctx);
}

public class PipelineContext {
private Object input;
private Object result;
// getters/setters...
}

public class Pipeline {
private final List<Stage> stages = new ArrayList<>();

public Pipeline add(Stage stage) {
stages.add(stage);
return this;
}

public PipelineContext execute(Object input) {
PipelineContext ctx = new PipelineContext();
ctx.setInput(input);
for (Stage stage : stages) {
stage.process(ctx);
}
return ctx;
}
}

// 使用
Pipeline pipeline = new Pipeline()
.add(new ValidateStage())
.add(new TransformStage())
.add(new PersistStage());
PipelineContext out = pipeline.execute(request);

说明:上例为同步串行管道。Netty 的 ChannelPipeline、Servlet Filter Chain、编译器前后端流水线等,是同一思想在不同领域的实现。

相关的模式

模式 关系
职责链 最相近。职责链常强调「谁能处理谁接手、可能短路」;管道更强调「按序必经各阶段加工」。
装饰器 包装增强同一对象;管道是多个阶段依次变换数据流。
模板方法 固定算法骨架;管道把步骤外置为可插拔阶段列表。
观察者 事件广播;管道是单向、有序的数据加工链。

适用场景

  • 请求处理:鉴权 → 限流 → 业务 → 审计 → 响应封装。
  • ETL / 数据清洗:抽取 → 校验 → 转换 → 加载。
  • 多媒体/编译:解码 → 滤镜 → 编码;词法 → 语法 → 优化 → 生成。
  • 消息中间件消费:反序列化 → 校验 → 业务 → 确认。

应用示例

  • **Netty ChannelPipeline**:入站/出站 Handler 链式处理 ByteBuf 与业务消息。
  • Servlet / Spring Filter:过滤器链对 HTTP 请求做横切处理。
  • CI/CD Pipeline:构建 → 测试 → 扫描 → 部署各 Stage。
  • Unix 管道cmd1 | cmd2 | cmd3,标准输出接到下一命令标准输入。

典型应用

在业务系统中,常把「下单」「支付回调」「内容审核」等流程配置成可编排管道,使规则变更只需增删 Stage,而不改核心交易代码。注意:若阶段间存在复杂补偿与回滚,需额外引入事务消息或 Saga,管道本身不解决分布式一致性。

相关参考

作者

光星

发布于

2022-07-22

更新于

2026-08-16

许可协议

评论