[GOF] 템플릿 메소드 패턴

2024. 3. 19. 11:35디자인패턴

1. Template Method Pattern

  • 여러 클래스에서 공통으로 사용하는 메소드를 템플릿화하여 상위 클래스에 정의하고, 하위 클래스마다 다르게 구현하는 패턴
  • 상속이라는 기술을 극대화 시켜 알고리즘의 뼈대를 맞추는것
  • 이미 많은 프레임워크에서 많은부분 템플릿 메소드 패턴 코드가 우리도 모르게 적용되어 있다.

  • AbstractClass(추상 클래스) : 템플릿 메소드를 구현하고, 메소드에서 돌아가는 추상 메소드를 선언한다. 
  • ConcreteClass(구현 클래스) : AbstractClass를 상속하고 추상 메소드를 구체적으로 구현한다.

2. 템플릿 메소드 패턴 흐름

abstract class AbstractTemplate {

    // 템플릿 메소드 : 메서드 앞에 final 키워드를 붙이면 자식 클래스에서 오버라이딩이 불가능함.
	// 자식 클래스에서 상위 템플릿을 오버라이딩해서 자기마음대로 바꾸도록 하는 행위를 원천 봉쇄
    public final void templateMethod() {
        // 상속하여 구현되면 실행될 메소드들
        step1();
        step2();
        
        if(hook()) { // 안의 로직을 실행하거나 실행하지 않음
            // ...
        }
        
        step3();
    }

    boolean hook() {
        return true;
    }

    // 상속하여 사용할 것이기 때문에 protected 접근제어자 설정
    protected abstract void step1();
    protected abstract void step2();
    protected abstract void step3();
}
class ImplementationA extends AbstractTemplate {

    @Override
    protected void step1() {}

    @Override
    protected void step2() {}

    @Override
    protected void step3() {}
}

class ImplementationB extends AbstractTemplate {

    @Override
    protected void step1() {}

    @Override
    protected void step2() {}

    @Override
    protected void step3() {}

    // hook 메소드를 오버라이드 해서 false로 하여 템플릿에서 마지막 로직이 실행되지 않도록 설정
    @Override
    protected boolean hook() {
        return false;
    }
}

3. 템플릿 메소드 특징

  • 클라이언트가 알고리즘의 특정 단계만 확장하고, 전체 알고리즘이나 해당 구조는 확장하지 않도록 할때
  • 동일한 기능은 상위클래스에서 정의하면서 확장, 변화가 필요한 부분만 하위클래스에서 구현할 때

장점

  • 상위 추상클래스로 로직을 공통화 하여 코드의 중복을 줄일 수 있다.
  • 서브 클래스의 역할을 줄이고, 핵심 로직을 상위 클래스에서 관리하므로 관리가 용이

단점

  • 알고리즘의 제공된 골격에 의해 유연성이 제한될 수 있다.
  • 알고리즘 구조가 복잡할수록 템플릿 로직 형태를 유지하기 어려워진다.
  • 추상 메소드가 많아지면서 클래스의 생성, 관리가 어려워진다.
  • 상위클래스에 선언된 추상메소드를 하위 클래스에서 구현할 때, 어느 타이밍에 호출되는지 클래스 로직을 이해해야 한다.

4. 적용 예제

추상클래스

// 더하기 연산 수행
class PlusFileProcessor extends FileProcessor{

    public PlusFileProcessor(String path) {
        super(path);
    }

    @Override
    protected int caculate(int result, int number) {
        return result += number;
    }
    
    @Override
    protected int getResult() {
        return 0;
    }
}

// 곱셈 연산 수행
class MultiplyFileProcessor extends FileProcessor{

    public MultiplyFileProcessor(String path) {
        super(path);
    }

    @Override
    protected int caculate(int result, int number) {
        return result *= number;
    }
    
    @Override
    protected int getResult() {
        return 1; // 곱셈은 초깃값이 0이면 결과도 멱등하니까
    }
}

5. Strategy vs Template Method

  • 전략 패턴과 템플릿 메소드 패턴은 알고리즘을 때에 따라 적용한다는 컨셉으로써, 공통점을 가지고 있다.
  • 개방형 폐쇠 원칙을 충족하고 코드를 변경하지 않고 소프트웨어 모듈을 쉽게 확장할 수 있도록 하는 데 사용할 수 있다.

차이점

  • 전략패턴은 합성, 템플릿 메소드 패턴은 상속을 통해 해결책을 제시한다.
  • 전략패턴은 주로 인터페이스, 템플릿 메소드 패턴은 주로 추상클래스
  • 단일 상속만이 가능한 자바에서는 상속 제한이 있는 템플릿 메소드 패턴보다는, 다양하게 많은 전략을 implements 할 수 있는 전략 패턴이 협업에서 많이 사용되는 편이다.

'디자인패턴' 카테고리의 다른 글

[GOF] 추상 팩토리 패턴  (0) 2024.04.02
[GOF] 상태(State) 패턴  (0) 2024.03.18
[GOF] 전략(Strategy) 패턴  (0) 2024.03.17
[GOF] 싱글톤(Singleton) 패턴  (1) 2024.03.16