管道-过滤器架构 考试重点
经典架构模式
数据依次流过一系列过滤器,每个过滤器完成一种转换,过滤器可组合、可替换。
结构示意
flowchart LR
S[源数据] --> F1[词法分析]
F1 --> F2[语法分析]
F2 --> F3[语义检查]
F3 --> T[中间表示]
知识说明
管道-过滤器(Pipe-Filter)中,Filter 是独立的处理步骤,Pipe 传递数据流。Unix 的 cmd1 | cmd2 | cmd3 是教科书例子。编译器前端(词法→语法→语义)、ETL、图像处理流水线同属此风格。
优点是步骤可重排、可并行(在管道允许时)。限制是数据要以流的形式约定格式,调试要看中间流,错误处理需约定策略。
特点
- 数据驱动
- 过滤器高内聚
- 管道连接
- 易插入新步骤
优点
- 模块化、可复用
- 易于扩展流水线
- 部分场景可并行
局限
- 中间格式要稳定
- 排错要跟踪数据流
- 不适合强交互式 GUI 逻辑
适用
编译器 ETL 图像/音视频处理 日志清洗
例子展示 —— 作业查重前的文本清洗流水线
问题
源码要先去注释、统一空白、再散列;若写在一个巨函数里,插入「去除 import」就要改整坨代码。
做法
每个 Filter 实现 transform(text)->text,Pipeline 按顺序执行。新增步骤只需加 Filter 并注册顺序。
flowchart LR
A[源代码] --> B[去注释]
B --> C[归一化空白]
C --> D[计算指纹]
interface Filter { String transform(String in); }
class StripCommentFilter implements Filter {
public String transform(String in) { return in.replaceAll("/\\*.*?\\*/", ""); }
}
class Pipeline {
private final List<Filter> filters = new ArrayList<>();
Pipeline add(Filter f) { filters.add(f); return this; }
String run(String src) {
String x = src;
for (Filter f : filters) x = f.transform(x);
return x;
}
}
def pipeline(text, filters):
for f in filters:
text = f(text)
return text
clean = pipeline(src, [strip_comment, normalize_space, hash_ready])