侧边栏壁纸
博主头像
东家博主等级

东家不是家,心里有个她!

  • 累计撰写 4 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Pipeline模型(过滤器模式)

东家
2023-05-21 / 0 评论 / 0 点赞 / 31 阅读 / 2,401 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-05-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Pipeline模型

简介

Pipeline(管道)是一种常见的设计模式,也被称为管道和过滤器模式(Pipe and Filter Pattern)。

它是一种结构型设计模式,用于将处理过程划分为一系列独立的处理单元(过滤器),每个处理单元负责特定的操作,并通过管道连接起来,将数据流经过各个处理单元进行处理。

Pipeline模式的核心思想是将处理过程分解成多个独立的阶段,并通过一条管道将数据在这些阶段中流动。每个阶段(过滤器)都只关注特定的操作,它接收输入数据,进行处理后产生输出数据,然后将输出数据传递给下一个阶段。这种方式可以将复杂的处理过程划分为简单的独立模块,提高了代码的可维护性、可测试性和可扩展性。

Pipeline模式的优点包括:

  • 模块化:每个处理阶段都是独立的模块,易于理解和维护。
  • 可重用性:可以在不同的场景中重用相同的过滤器来处理不同的数据。
  • 可扩展性:可以简单地添加或替换过滤器,以满足新的需求。
  • 可组合性:可以通过组合不同的过滤器来创建复杂的处理流程。

总之,Pipeline模式是一种将处理过程分解成多个独立阶段的设计模式,它提供了一种结构化的方式来处理数据,并可以灵活地组合和扩展各个处理阶段。

Pipeline示例

// 数据采集器
public interface DataCollector {
    List<Object> collectData();
}

// 数据过滤器
public interface DataFilter {
    List<String> filterData(List<Object> inputData);
}

// 数据输出器
public interface DataOutput {
    void outputData(List<String> outputData);
}

// 具体的数据采集器实现
public class SimpleDataCollector implements DataCollector {
    @Override
    public List<String> collectData() {
        // 数据采集逻辑
        // ...
    }
}

// 具体的数据过滤器实现
public class SimpleDataFilter implements DataFilter {
    @Override
    public List<String> filterData(List<String> inputData) {
        // 数据过滤逻辑
        // ...
    }
}

// 具体的数据输出器实现
public class SimpleDataOutput implements DataOutput {
    @Override
    public void outputData(List<String> outputData) {
        // 数据输出逻辑
        // ...
    }
}

// Pipeline类
public class Pipeline {
    private final DataCollector dataCollector;
    private final DataFilter dataFilter;
    private final DataOutput dataOutput;

    public Pipeline(DataCollector dataCollector, DataFilter dataFilter, DataOutput dataOutput) {
        this.dataCollector = dataCollector;
        this.dataFilter = dataFilter;
        this.dataOutput = dataOutput;
    }

    public void executePipeline() {
        // 采集数据
        List<String> collectedData = dataCollector.collectData();

        // 过滤数据
        List<String> filteredData = dataFilter.filterData(collectedData);

        // 输出数据
        dataOutput.outputData(filteredData);
    }
}

// 示例代码的使用
public class Main {
    public static void main(String[] args) {
        // 创建具体的实例
        DataCollector dataCollector = new SimpleDataCollector();
        DataFilter dataFilter = new SimpleDataFilter();
        DataOutput dataOutput = new SimpleDataOutput();

        // 创建Pipeline实例
        Pipeline pipeline = new Pipeline(dataCollector, dataFilter, dataOutput);

        // 执行Pipeline
        pipeline.executePipeline();
    }
}

对比责任链模式

虽然Pipeline模式和责任链模式都可以用于处理数据流,但它们有一些关键的区别。

Pipeline模式(管道和过滤器模式)着重于将处理过程划分为多个独立的处理阶段,并通过管道将数据从一个阶段传递到另一个阶段。每个处理阶段(过滤器)负责特定的操作,并将输出传递给下一个阶段。Pipeline模式强调各个处理阶段的独立性,每个过滤器可以对数据进行任意处理,而不需要考虑其他过滤器的存在。Pipeline模式通常用于将复杂的处理过程分解成简单的独立模块,提高可维护性和可扩展性。

责任链模式(Chain of Responsibility Pattern)着重于将请求沿着一个链式结构传递,并由该链中的不同对象依次处理请求,直到请求被处理或到达链的末尾。每个处理对象都有机会处理请求,如果无法处理,则将请求传递给链中的下一个对象。责任链模式强调请求的传递和处理对象的协作,每个处理对象都有责任决定是否能够处理请求。责任链模式通常用于解耦发送者和接收者,动态地组织处理流程,以及在运行时决定请求的处理方式。

关键区别:

  1. 职责不同:Pipeline模式将处理过程分解为多个独立的处理阶段(过滤器),每个阶段负责特定的操作;责任链模式将请求传递给链中的不同对象,每个对象有机会处理请求。
  2. 协作方式不同:Pipeline模式的过滤器之间通常是相互独立的,每个过滤器可以对数据进行任意处理;责任链模式中的对象之间通常是紧密协作的,每个对象负责判断是否能够处理请求并将请求传递给下一个对象。
  3. 关注点不同:Pipeline模式关注将处理过程分解成独立模块,提高可维护性和可扩展性;责任链模式关注请求的传递和对象之间的协作,动态组织处理流程。

具体解释:

在本质上,Pipeline模式和责任链模式的区别可以归结为两个关键方面:职责分配和数据处理方式。

  1. 职责分配:
    • Pipeline模式将处理过程分解为多个独立的处理阶段(过滤器),每个阶段负责特定的操作,且处理阶段之间一般是相互独立的(每个阶段输入和输出的对象可能不同)。
    • 责任链模式将请求传递给链中的不同对象,每个对象有机会处理请求,且处理对象之间通常紧密协作(每个阶段输入和输出的对象相同)。
  2. 数据处理方式:
    • 在Pipeline模式中,每个处理阶段(过滤器)可以对数据进行任意处理,因此处理阶段之间的顺序可能是固定的或可配置的。
    • 在责任链模式中,每个处理对象通常只负责特定类型的请求处理,且处理对象之间的顺序是固定的。

责任链对比代码:

// 请求对象
public class Request {
    private final String data;

    public Request(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }
}

// 处理器接口
public interface Handler {
    void handleRequest(Request request);
}

// 具体的处理器实现
public class DataCollector implements Handler {
    private Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Request request) {
        if (request.getData().startsWith("Collect")) {
            // 数据采集逻辑
            // ...
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class DataFilter implements Handler {
    private Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Request request) {
        if (request.getData().startsWith("Filter")) {
            // 数据过滤逻辑
            // ...
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class DataOutput implements Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getData().startsWith("Output")) {
            // 数据输出逻辑
            // ...
        }
    }
}

// 示例代码的使用
public class Main {
    public static void main(String[] args) {
        // 创建具体的处理器实例
        Handler dataCollector = new DataCollector();
        Handler dataFilter = new DataFilter();
        Handler dataOutput = new DataOutput();

        // 构建责任链
        dataCollector.setNextHandler(dataFilter);
        dataFilter.setNextHandler(dataOutput);

        // 创建请求对象
        Request request = new Request("Collect, Filter, Output");

        // 处理请求
        dataCollector.handleRequest(request);
    }
}

对比Java Stream

在实际开发中,不要为了设计而设计,能用简单的技术栈完成需求是最好的,因此我们对比以下Java Stream。

Pipeline模式和Java Stream具有一些相似之处,尤其是在数据处理的方面。

Java Stream是Java 8引入的一种功能强大的数据处理API,它提供了一种流式处理数据的方式。通过使用Stream,可以将数据集合转换、筛选、聚合等一系列操作连缀在一起,形成一个处理流程。类似于Pipeline模式,Stream可以将数据处理过程划分为多个阶段(操作),每个阶段负责特定的操作,并将输出传递给下一个阶段。

虽然Stream和Pipeline模式在概念上有相似之处,但也存在一些差异。主要区别如下:

  1. 定义方式:Stream是Java语言级别的特性,提供了一套API来支持流式处理;而Pipeline模式是一种设计模式,是一种通用的编程模式。
  2. 应用范围:Stream主要用于处理集合数据,提供了一种便捷的方式来对集合进行处理和转换;而Pipeline模式可以应用于更广泛的场景,不限于集合处理,可以用于任何需要流式处理的数据流程。
  3. 强调点:Stream更注重函数式编程的思想,强调对集合的转换和聚合操作,提供了丰富的API来支持这些操作;而Pipeline模式更注重数据处理的流程设计和组织,将整个处理过程划分为独立的阶段,并通过管道将数据从一个阶段传递到另一个阶段。

虽然Java Stream可以部分地看作是Pipeline模式的一种实现,但Pipeline模式更为通用和灵活,可以应用于各种数据处理场景,而不仅仅局限于集合操作。

0

评论区