Updated:

1. 개요

알고리즘의 뼈대를 정의하고, 구체적인 기능은 서브 클래스에 구현하도록 하는 패턴

템플릿 메서드 패턴(Template Method Pattern)은 행동 패턴(Behavioral Pattern)의 한 종류로, 공통된 기능을 상위 클래스에 정의하고, 자주 변경되며 확장되는 기능을 서브 클래스에 구현하여 효율적으로 재사용 가능하도록 한 패턴이다.

2. 행동 패턴(Behavioral Pattern)

2-1. 행동 패턴이란?

행동 패턴이란 처리의 책임을 어떤 객체에게 할당하는 것이 좋은지, 알고리즘을 어떤 객체에 정의하는 것이 좋은지 등의 책임 분배와 관련된 패턴이다.

2-2. 행동 패턴 종류

3. 구성

[출처 : GoF의 디자인 패턴]

  • AbstractClass : 알고리즘의 뼈대가 되는 공통 기능을 정의한 클래스

  • ConcreteClass : 구체적인 기능을 구현한 서브 클래스

4. 예제 코드

커피를 만드는 코드를 구현한다고 가정해보자. Template Method Pattern을 이용하면 서브 클래스를 통해 다양한 종류의 커피를 만들 수 있다.

4-1. AbstractClass

[Coffee.java]

1
2
3
4
5
6
7
8
9
10
11
12
public abstract class Coffee {

    abstract void base();
    abstract void syrup();
    abstract void beans();

    public final void makeCoffee() {
        base();
        syrup();
        beans();
    }
}

4-2. ConcreteClass

[Americano.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Americano extends Coffee {

    @Override
    void base() {
        System.out.println("Water");
    }

    @Override
    void syrup() {
        System.out.println("No Syrup");
    }

    @Override
    void beans() {
        System.out.println("Columbia Beans");
    }
}

[VanillaLatte.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class VanillaLatte extends Coffee {

    @Override
    void base() {
        System.out.println("Milk");
    }

    @Override
    void syrup() {
        System.out.println("Vanilla Syrup");
    }

    @Override
    void beans() {
        System.out.println("Brazil Beans");
    }
}

5. 테스트

[Clinet.java]

1
2
3
4
5
6
7
8
9
10
11
12
public class Client {

    public static void main(String[] args) {
        Coffee coffee = new Americano();
        System.out.println("=== Americano ===");
        coffee.makeCoffee();

        coffee = new VanillaLatte();
        System.out.println("=== Vanilla Latte ===");
        coffee.makeCoffee();
    }
}

[실행 결과]

6. 특징

  • 확장 용이 : 서브 클래스를 통한 확장의 용이

  • 코드의 중복 감소 : 공통기능을 추상 클래스에 정의하여 코드의 중복 감소

  • 클래스 관리의 어려움 : 상위 클래스가 바뀌면 모든 하위클래스를 수정해야 함

Updated:

Leave a comment