본문 바로가기
데일리 공부

[디자인패턴] 템플릿 메소드 패턴

by 코더 제이콥 2023. 5. 29.

템플릿 메소드 패턴은 부모 클래스에서 알고리즘을 정의하나, 해당 알고리즘을 변경하지 않고 하위 클래스에서 특정 알고리즘을 재정의하는 패턴입니다.

 

예제


@Slf4j
public abstract class Animal {
    public void questionAboutHowToTalk(){
        log.info("이 동물은 누구일까요?");
        log.info("힌트: 소리를 잘 들어보세요.");
        sound();
        log.info("누구일까요?");
    }

    protected abstract void sound();
}

 

부모 클래스 Animal에 알고리즘을 정의했습니다. sound() 메소드는 Animal을 상속 받은 자식 클래스에서 오버라이딩 할 것입니다.

 

@Slf4j
public class Dog extends Animal{

    @Override
    protected void sound() {
        log.info("멍멍!");
    }
}

@Slf4j
public class Cat extends Animal{

    @Override
    protected void sound() {
        log.info("야옹~");
    }
}

자식 클래스들입니다. 각각 Animal을 상속 받아, sound() 메소드를 오버라이딩 했습니다.

그림1. 템플릿 메소드 패턴 구조

 

테스트 해보겠습니다.

public class TemplateMethodPatternTest {

    @Test
    void templatePattern(){
        Animal dog = new Dog();
        dog.questionAboutHowToTalk();

        Animal cat = new Cat();
        cat.questionAboutHowToTalk();
    }
}

결과

17:26:50.810 [Test worker] INFO remind.pattern.template.Animal - 이 동물은 누구일까요?
17:26:50.813 [Test worker] INFO remind.pattern.template.Animal - 힌트: 소리를 잘 들어보세요.
17:26:50.814 [Test worker] INFO remind.pattern.template.Dog - 멍멍!
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 누구일까요?
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 이 동물은 누구일까요?
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 힌트: 소리를 잘 들어보세요.
17:26:50.814 [Test worker] INFO remind.pattern.template.Cat - 야옹~
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 누구일까요?

상위 클래스에서 알고리즘을 정의했고, 하위 클래스에서 알고리즘의 일부를 재정의했습니다. 그 결과로 각 강아지와 고양이는 고정적인 알고리즘 가운데 개별로 재정의한 <멍멍!>과 <야옹~>이 출력되었습니다.

 

장단점


장점:

  1. 코드 중복 최소화: 템플릿 메소드 패턴은 알고리즘의 공통 부분을 상위 클래스의 추상 메소드로 정의하므로, 하위 클래스에서 이를 재사용 가능합니다. 이를 통해 코드의 중복을 최소화할 수 있습니다. 
  2. 유연성과 확장성: 알고리즘의 구조를 정의하는 상위 클래스와 각 일부 알고리즘을 구현하는 하위 클래스로 구성되기 때문에, 각 단계를 독립적으로 변경하거나 확장할 수 있습니다. 즉, 알고리즘의 일부를 변경해도 전체 구조를 수정하지 않아도 되므로 유연성과 확장성이 높아집니다.

단점:

  1. 상속이란 제약 발생: 템플릿 메소드 패턴은 상속을 사용하기 때문에, 하위 클래스에서 상위 클래스의 메소드를 재정의해야 합니다. 이로 인해 클래스 간의 강한 결합도가 발생할 수 있고, 상속이란 제약을 갖습니다.
  2. 알고리즘 구조 변경의 까다로움: 템플릿 메소드 패턴은 알고리즘의 구조를 미리 정의하고 하위 클래스에서 구체적인 구현을 제공하는 방식이기 때문에, 알고리즘의 구조를 변경해야 하는 경우에는 상위 클래스의 변경이 필요하며, 이는 다른 하위 클래스들에도 영향을 줄 수 있습니다.