디자인패턴 TemplateMethod Pattern
템플릿 메서도 패턴은 메서드에서 알고리즘의 골격을 정의합니다.
알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다.
템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의 할 수 있습니다.
TemplateMethod Pattern 실제로 어떻게 적용할까요?
버거 레시피를 만들 예정입니다.
버거에 들어가는 재료들을 확인하는 기능을 만들겠습니다.

각각의 레시피에 조금 다른 부분이 있긴 하지만, 만드는 방법은 똑같다고 볼 수 있기 때문에, 다른 부분을 추상화 시켜 공유하기로 했습니다.

다른 부분을 찾아서 추상화를 했습니다.
이 클래스는 버거 레시피의 알고리즘 틀입니다.
알고리즘 틀
템플릿 메소드 패턴은 간단하게 생각하면 알고리즘의 틀을 만들기 위한 패턴입니다.
틀이란 일련의 단계들로 알고리즘을 정의한 메소드입니다.
일련의 단계들 중 하나 이상이 추상 메소드로 정의되며, 그 추상 메소드는 서브클래스에서 구현됩니다.
이렇게 하면 서브클래스에서 달라지는 부분을 구현할 수 있도록 하면서도 알고리즘의 구조는 바꾸지 않아도 됩니다.
달라지는 부분은 어떻게 구현할까요?
템플릿 메소드에서는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다.

버거 레시피 추상클래스가 있고, 그 레시피를 상속받은 치킨버거와 불고기버거 클래스가 있습니다.
서브클래스를 구현하여 다른 부분에 대해 정의하면 하겠습니다.
구현
BurgerBeverage
package cg.park.designpattern.templateMethod;
public abstract class BurgerBeverage {
final void makeBurger() {
menu();
bread();
patty();
onion();
sauce();
cheese();
}
abstract void menu();//메뉴
abstract void patty();//패티(돼지,닭,소 등...)
abstract void sauce();//버거 소스
void bread() { System.out.println("모닝빵");}
void onion() { System.out.println("양파");}
void cheese() { System.out.println("치즈");}
}
ChickenBurger
package cg.park.designpattern.templateMethod;
public class ChickenBurger extends BurgerBeverage {
public void menu() { System.out.println("*치킨 버거");}
public void patty() { System.out.println("치킨 패티");}
public void sauce() { System.out.println("양념치킨소스");}
}
BulgogiBurger
package cg.park.designpattern.templateMethod;
public class BulgogiBurger extends BurgerBeverage {
public void menu() { System.out.println("*불고기 버거");}
public void patty() { System.out.println("불고기 패티");}
public void sauce() { System.out.println("불고기 소스");}
}
TemplateMethodTest
package cg.park.designpattern.templateMethod;
public class TemplateMethodTest {
public static void main(String[] args) {
BulgogiBurger bulgogiBurger = new BulgogiBurger();
ChickenBurger chickenBurger = new ChickenBurger();
bulgogiBurger.makeBurger();
System.out.println("==========================");
chickenBurger.makeBurger();
}
}

후기
템플릿 메서드 패턴은 실무에서도 많이 사용되는 패턴입니다.
디자인 패턴에 대해 학습하고, 신규로 접하는 프로젝트가 디자인 패턴이 적용되어 있다면 코드 확장에 필요한 지식이 될 것입니다.
Git: https://github.com/qkrcksrbs8/designpattern
참조 자료: Head First Design Patterns
'스프링 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Iterator Pattern 이터레이터 패턴 (0) | 2022.01.21 |
---|---|
[디자인패턴] Facade Pattern (0) | 2022.01.13 |
[디자인패턴] Adapter Pattern (0) | 2022.01.11 |
[디자인패턴] Command Pattern (0) | 2022.01.09 |
[디자인패턴] Singleton Pattern (0) | 2022.01.08 |