管道-过滤器架构 考试重点

经典架构模式

数据依次流过一系列过滤器,每个过滤器完成一种转换,过滤器可组合、可替换。

结构示意
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])