Computer Science/Design Pattern

[Design Pattern] 템플릿 메소드 패턴 (Template Method Pattern)

dbssk 2023. 9. 23. 09:20

템플릿 메소드 패턴(Template Method Pattern)

  • 슈퍼클래스에서 템플릿를 정의하고 구체적인 단계는 서브클래스에게 위임하는 패턴
  • 사용 방법
    • 슈퍼클래스에서 템플릿을 정의하고, 필요한 메소드를 추상 메소드나 구현된 메소드로 선언
    • 서브클래스에서 추상 메소드를 구현하거나, 구체적인 메소드를 오버라이딩하여 알고리즘의 일부를 정의
    • 슈퍼클래스에서 정의한 템플릿 메소드를 호출하여 알고리즘을 실행

  • 장점
    • 코드 중복 최소화 : 공통된 부분을 슈퍼클래스에서 구현하여 코드 중복을 방지할 수 있다.
    • 확장성 : 서브클래스를 추가하거나 기존 클래스를 수정하지 않고 알고리즘을 확장할 수 있다. → 개방-폐쇄원칙 (OCP) 보장

  • 단점
    • 너무 많은 서브클래스가 생성되면 클래스 계층 구조가 복잡해질 수 있다.
    • 상위 클래스의 로직이 수정되면, 모든 서브 클래스를 수정해야 할 수도 있다.

 

구현 코드

// 슈퍼클래스: 음료 추상 클래스
abstract class Beverage {
    // 템플릿 메소드
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 추상 메소드: 서브클래스에서 구현해야 함
    abstract void brew();
    abstract void addCondiments();

    // 공통 메소드
    void boilWater() {
        System.out.println("물 끓이기");
    }

    void pourInCup() {
        System.out.println("컵에 따르기");
    }
}

// 서브클래스 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("레몬 추가");
    }
}

public class TemplateMethodDemo {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareBeverage();

        System.out.println("------------------------");

        Beverage tea = new Tea();
        tea.prepareBeverage();
    }
}

 

 

[참고] https://gyoogle.dev/blog/design-pattern/Template%20Method%20Pattern.html

댓글수0