PHpullh
학습 라이브러리/Java/Strategy & Template Method 패턴

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 로 선언하세요.