JAVA · 디자인패턴
Strategy & Template Method 패턴
알고리즘을 캡슐화하는 Strategy와 알고리즘 골격을 정의하는 Template Method.
디자인패턴중급StrategyTemplate Methodlambda@FunctionalInterfaceabstract
핵심 설명
알고리즘을 캡슐화하는 Strategy와 알고리즘 골격을 정의하는 Template Method.
Java code
import java.util.*;
// Strategy 패턴 — 람다로 간결하게 구현
@FunctionalInterface
interface SortStrategy<T extends Comparable<T>> {
List<T> sort(List<T> items);
}
class Sorter<T extends Comparable<T>> {
private SortStrategy<T> strategy;
public Sorter(SortStrategy<T> strategy) {
this.strategy = strategy;
}
public void setStrategy(SortStrategy<T> strategy) {
this.strategy = strategy;
}
public List<T> sort(List<T> items) {
return strategy.sort(items);
}
}
// Template Method 패턴 — 추상 클래스
abstract class DataProcessor {
// 템플릿 메서드 — 알고리즘 골격 (final)
public final void process(String data) {
String validated = validate(data);
String parsed = parse(validated);
String result = transform(parsed);
output(result);
}
protected abstract String validate(String data);
protected abstract String parse(String data);
protected abstract String transform(String data);
// 후크 — 선택적 오버라이드
protected void output(String result) {
System.out.println("결과: " + result);
}
}
class CsvProcessor extends DataProcessor {
@Override protected String validate(String d) {
if (d.isBlank()) throw new IllegalArgumentException("빈 데이터");
return d.trim();
}
@Override protected String parse(String d) { return d.replace(",", "|"); }
@Override protected String transform(String d) { return d.toUpperCase(); }
}
class Main {
public static void main(String[] args) {
var nums = new ArrayList<>(List.of(5, 2, 8, 1, 9, 3));
// 람다로 전략 전달
var sorter = new Sorter<Integer>(items -> {
var sorted = new ArrayList<>(items);
Collections.sort(sorted);
return sorted;
});
System.out.println(sorter.sort(nums));
// 전략 교체
sorter.setStrategy(items -> {
var sorted = new ArrayList<>(items);
sorted.sort(Comparator.reverseOrder());
return sorted;
});
System.out.println(sorter.sort(nums));
// Template Method
new CsvProcessor().process(" alice,30,seoul ");
}
}학습 팁
Java 8+ 람다를 사용하면 Strategy 패턴을 전략 클래스 없이 간결하게 구현할 수 있습니다. @FunctionalInterface로 선언된 인터페이스가 핵심입니다.
주의할 점
Template Method에서 훅 메서드를 private으로 선언하면 오버라이드할 수 없습니다. 반드시 protected로 선언하세요.
자주 묻는 질문
Strategy & Template Method 패턴란 무엇인가요?
알고리즘을 캡슐화하는 Strategy와 알고리즘 골격을 정의하는 Template Method.
Strategy & Template Method 패턴 학습 시 주의할 점은 무엇인가요?
Template Method에서 훅 메서드를 private 으로 선언하면 오버라이드할 수 없습니다. 반드시 protected 로 선언하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.