[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 |