디자인 패턴
자바(JAVA) - 템플릿 메서드(Template Method) 패턴
Hyeongjun_Ham
2023. 10. 13. 16:27
1. 의도
부모 클래스에서 알고리즘의 골격을 정의하지만,
해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 한다.
2. 용도
전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현한다.
3. UML
4. 구현
- 예시) 커피 만들기
아이스 아메리카노 | 아이스 라떼 |
1. 물을 끓인다. 2. 끓는 물에 에스프레소를 넣는다. 3. 얼음을 넣는다. 4. 시럽을 넣는다. |
1. 물을 끓인다. 2. 끓는 물에 에스프레소를 넣는다. 3. 얼음을 넣는다. 4. 우유를 넣는다. |
1 ~ 3번의 알고리즘이 동일하다.
- 패턴 적용 전
public class IceAmericano {
public void makeIceAmericano() {
boilWater();
putEspresso();
putIce();
putSyrup();
}
private void boilWater() {
System.out.println("물을 끓인다.");
}
private void putEspresso() {
System.out.println("끓는 물에 에스프레소를 넣는다.");
}
private void putIce() {
System.out.println("얼음을 넣는다.");
}
private void putSyrup() {
System.out.println("시럽을 넣는다.");
}
}
public class IceLatte {
public void makeIceLatte() {
boilWater();
putEspresso();
putIce();
putMilk();
}
private void boilWater() {
System.out.println("물을 끓인다.");
}
private void putEspresso() {
System.out.println("끓는 물에 에스프레소를 넣는다.");
}
private void putIce() {
System.out.println("얼음을 넣는다.");
}
private void putMilk() {
System.out.println("우유를 넣는다.");
}
}
public class MakeCoffeeMain {
public static void main(String[] args) {
IceAmericano americano = new IceAmericano();
IceLatte latte = new IceLatte();
americano.makeIceAmericano();
latte.makeIceLatte();
}
}
- 패턴 적용 후
public abstract class Coffee {
final void makeCoffee() {
boilWater();
putEspresso();
putIce();
putExtra();
}
// SubClass에게 확장/변화가 필요한 코드만 코딩하도록 한다.
abstract void putExtra();
// 공통된 부분은 상위 클래스에서 해결하여 코드 중복을 최소화 시킨다.
private void boilWater() {
System.out.println("물을 끓인다.");
}
private void putEspresso() {
System.out.println("끓는 물에 에스프레소를 넣는다.");
}
private void putIce() {
System.out.println("얼음을 넣는다.");
}
}
public class IceAmericano extends Coffee{
@Override
void putExtra() {
System.out.println("시럽을 넣는다.");
}
}
public class IceLatte extends Coffee{
@Override
void putExtra() {
System.out.println("우유를 넣는다.");
}
}
public class CoffeeMain {
public static void main(String[] args) {
IceAmericano americano = new IceAmericano();
IceLatte latte = new IceLatte();
americano.makeCoffee();
latte.makeCoffee();
}
}
5. Template Method 패턴의 장단점
- 장점
- 중복 코드를 줄일 수 있다.
- 서브 클래스의 역할을 줄이고 핵심 로직을 상위 클래스에서 관리하므로 관리가 용이해진다.
- 새로운 비즈니스 로직이 추가되어도 기존 코드에 변경이 없다.
- 단점
- 알고리즘의 제공된 골격에 의해 유연성이 제한될 수 있다.
- 상위클래스에서 선언된 추상 메서드를 하위 클래스에서 구현할 때 그 메서드가 어느 타이밍에 호출되는지 로직을 이해해야 할 필요가 있다.
- 리스코프 치환 법칙을 위배할 여지가 있다.
출처 :
https://refactoring.guru/design-patterns/template-method
Template Method
Problem Imagine that you’re creating a data mining application that analyzes corporate documents. Users feed the app documents in various formats (PDF, DOC, CSV), and it tries to extract meaningful data from these docs in a uniform format. The first vers
refactoring.guru