파이프-필터 패턴(Pipe-Filter Pattern)은 데이터를 단계별로 처리할 수 있도록 각 작업을 필터로 나누고, 이들 필터 간 데이터를 전달하기 위해 파이프를 사용하는 구조이다.
데이터의 순차적 처리가 필요한 시스템에서 주로 사용되며, 필터 단위로 작업을 나누어 독립적으로 처리할 수 있는 장점이 있다.
파이프-필터 패턴은 복잡한 데이터 처리를 단계별로 나누어 처리하고, 각 단계의 결과를 순차적으로 다음 단계로 넘길 때 유용하다.
파이프-필터 패턴은 특히 데이터 스트림, 이미지 프로세싱, 데이터 변환 등 다양한 분야에서 사용된다.
이미지 처리 시스템에서 필터는 밝기 조정, 색상 보정, 필터 적용 등의 작업을 수행하며, 파이프를 통해 데이터를 전달한다.
Input Data ---> [ Filter 1 ] ---> [ Filter 2 ] ---> [ Filter n ] ---> Output Data
이번 예시에서는 문자열 데이터를 필터링하는 파이프-필터 패턴을 구현해보자. 각 필터는 문자열을 변환하는 역할을 하며, 파이프를 통해 순차적으로 데이터를 전달한다.
// Pipeline 클래스: 필터를 연결하고 데이터 스트림을 처리
import java.util.ArrayList;
import java.util.List;
public class Pipeline {
private List<Filter> filters = new ArrayList<>();
public void addFilter(Filter filter) {
filters.add(filter);
}
public String execute(String input) {
String result = input;
for (Filter filter : filters) {
result = filter.process(result);
}
return result;
}
}
// Filter 인터페이스: 필터가 구현해야 하는 프로세스 메서드를 정의
public interface Filter {
String process(String input);
}
// UppercaseFilter 클래스: 문자열을 대문자로 변환
public class UppercaseFilter implements Filter {
@Override
public String process(String input) {
return input.toUpperCase();
}
}
// ExclamationFilter 클래스: 문자열 끝에 느낌표를 추가
public class ExclamationFilter implements Filter {
@Override
public String process(String input) {
return input + "!";
}
}
// Main 클래스: 파이프라인을 구성하고 필터를 실행
public class Main {
public static void main(String[] args) {
Pipeline pipeline = new Pipeline();
pipeline.addFilter(new UppercaseFilter());
pipeline.addFilter(new ExclamationFilter());
String input = "hello";
String output = pipeline.execute(input);
System.out.println("최종 결과: " + output); // 출력: "HELLO!"
}
}
Pipeline
클래스는 여러 필터를 추가하고 순차적으로 실행할 수 있는 기능을 제공한다.Filter
인터페이스는 각 필터가 구현할 process
메서드를 정의한다.Pipeline
에 필터들을 추가하고, execute
메서드를 통해 입력 문자열을 변환하여 출력한다.최종 결과: HELLO!
파이프-필터 패턴(Pipe-Filter Pattern)은 데이터를 단계별로 처리할 수 있어 복잡한 데이터 처리나 변환 작업에 유용하다.
필터를 독립적으로 동작하게 하여 유지보수성과 유연성을 높일 수 있다.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음