본문 바로가기

cs(with 매일메일)

[260303화] 템플릿 메서드 패턴이란 무엇인가요?

기능의 뼈대와 구현을 분리하는 행위

 

장점

- 공통 로직을 상위 클래스에 모아 중복 코드를 줄일 수 있다.

- 코드의 재사용성

 

단점

- 하위 클래스를 개발할때까지 어떤 방식으로 동작할지 예측 어려움 

- 상위 클래스 수정 시 모든 하위 클래스를 변경해야 한다. 

 

// 상위 클래스 - 뼈대(알고리즘 순서) 정의
abstract class Beverage {
    
    // 템플릿 메서드 - 전체 흐름을 고정
    // final로 하위 클래스가 순서를 바꾸지 못하게 막음
    final void makeBeverage() {
        boilWater();     // 공통
        brew();          // 하위 클래스가 구현
        pourInCup();     // 공통
        addCondiments(); // 하위 클래스가 구현
    }

    // 공통 로직 - 상위 클래스에서 처리
    private void boilWater() {
        System.out.println("물을 끓인다");
    }

    private void pourInCup() {
        System.out.println("컵에 붓는다");
    }

    // 추상 메서드 - 하위 클래스가 반드시 구현
    abstract void brew();
    abstract void addCondiments();
}

 

// 하위 클래스 1 - 커피
class Coffee extends Beverage {

    @Override
    void brew() {
        System.out.println("필터로 커피를 우려낸다");
    }

    @Override
    void addCondiments() {
        System.out.println("설탕과 우유를 추가한다");
    }
}

// 하위 클래스 2 - 홍차
class Tea extends Beverage {

    @Override
    void brew() {
        System.out.println("찻잎을 우려낸다");
    }

    @Override
    void addCondiments() {
        System.out.println("레몬을 추가한다");
    }
}