GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — java-design-patterns/pipeline at master · tmollard/java-design-patterns

Expand file tree

/

pipeline

/
Copy path

Directory actions

More options

More options

Directory actions

More options

More options

Latest commit

 

History

History
History
 
 
/

pipeline

/
Copy path

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
etc
etc
 
 
src
src
 
 
README.md
README.md
 
 
pom.xml
pom.xml
 
 

README.md

Outline
layout pattern
title Pipeline
folder pipeline
permalink /patterns/pipeline/
categories Behavioral
tags
Decoupling

Intent

Allows processing of data in a series of stages by giving in an initial input and passing the processed output to be used by the next stages.

Explanation

The Pipeline pattern uses ordered stages to process a sequence of input values. Each implemented task is represented by a stage of the pipeline. You can think of pipelines as similar to assembly lines in a factory, where each item in the assembly line is constructed in stages. The partially assembled item is passed from one assembly stage to another. The outputs of the assembly line occur in the same order as that of the inputs.

Real world example

Suppose we wanted to pass through a string to a series of filtering stages and convert it as a char array on the last stage.

In plain words

Pipeline pattern is an assembly line where partial results are passed from one stage to another.

Wikipedia says

In software engineering, a pipeline consists of a chain of processing elements (processes, threads, coroutines, functions, etc.), arranged so that the output of each element is the input of the next; the name is by analogy to a physical pipeline.

Programmatic Example

The stages of our pipeline are called Handlers.

interface Handler<I, O> {
  O process(I input);
}

In our string processing example we have 3 different concrete Handlers.

class RemoveAlphabetsHandler implements Handler<String, String> {
  ...
}

class RemoveDigitsHandler implements Handler<String, String> {
  ...
}

class ConvertToCharArrayHandler implements Handler<String, char[]> {
  ...
}

Here is the Pipeline that will gather and execute the handlers one by one.

class Pipeline<I, O> {

  private final Handler<I, O> currentHandler;

  Pipeline(Handler<I, O> currentHandler) {
    this.currentHandler = currentHandler;
  }

  <K> Pipeline<I, K> addHandler(Handler<O, K> newHandler) {
    return new Pipeline<>(input -> newHandler.process(currentHandler.process(input)));
  }

  O execute(I input) {
    return currentHandler.process(input);
  }
}

And here's the Pipeline in action processing the string.

    var filters = new Pipeline<>(new RemoveAlphabetsHandler())
        .addHandler(new RemoveDigitsHandler())
        .addHandler(new ConvertToCharArrayHandler());
    filters.execute("GoYankees123!");

Class diagram

alt text

Applicability

Use the Pipeline pattern when you want to

  • Execute individual stages that yields a final value.
  • Add readability to complex sequence of operations by providing a fluent builder as an interface.
  • Improve testability of code since stages will most likely be doing a single thing, complying to the Single Responsibility Principle (SRP)

Known uses

  • java.util.Stream
  • Maven Build Lifecycle
  • Functional Java

Related patterns

  • Chain of Responsibility

Credits

  • The Pipeline Pattern — for fun and profit
  • The Pipeline design pattern (in Java)
  • Pipelines | Microsoft Docs
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.