템플릿 메소드
알고리즘의 골격을 정의합니다. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수도 있습니다.
즉, 알고리즘의 틀을 만들어 놓고, 세부 사항은 서브클래스에서 채워 넣을 수 있게 하는 디자인 방식입니다.
장점
- 재사용성 : 공통 알고리즘을 부모 클래스에 정의하여 여러 하위 클래스에서 재사용이 가능하다.
- 유연성 : 알고리즘 일부를 서브클래스로 미루어 쉬운 변경과 확장이 가능합니다.
단점
- 클래스 수의 증가 : 각 단계별로 서브클래스가 필요하여 복잡해질 수 있습니다.
- 변경 어려움 : 부모 클래스의 알고리즘 변경이 모든 서브클래스에 영향을 끼쳐 유지보수가 어려워질 수 있습니다.
템플릿 메서드 예제
오늘은 치킨을 가지고 예제를 만들어 보겠습니다.
public abstract class Chicken {
public final void executeRecipe() {
prepareIngredients();
fry();
mix();
serve();
}
private void prepareIngredients() {
System.out.println("재료를 준비합니다.");
}
private void fry() {
System.out.println("치킨을 튀깁니다.");
}
// 후크 메소드 - 필요에 따라 오버라이드
protected void mix() {
if (changeSauceRequired()) {
System.out.println("치킨을 양념에 버무립니다.");
}
}
// 조건에 따라 후크 메소드 실행 여부 결정
protected abstract boolean changeSauceRequired();
private void serve() {
System.out.println("치킨 나왔습니다.");
}
}
후크 메소드란 추상 클래스에서 선언되지만, 기본적인 내용만 들어있거나 아무것도 들어있지 않은 메소드 입니다.
여기서 후크 메소드를 호출하는지 안 하는지에 따라 다른 종류의 치킨을 만들 수 있도록 했습니다.
public class FriedChicken extends Chicken {
@Override
protected boolean changeSauceRequired() {
return false;
}
}
public class SeasonedChicken extends Chicken {
@Override
protected boolean changeSauceRequired() {
return true;
}
}
public class SoySauceChicken extends Chicken {
@Override
protected boolean changeSauceRequired() {
return true;
}
}
후라이드 치킨은 소스가 필요 없기 때문에 false를 반환하여 후크 메소드를 호출하여 소스를 버무리는 일이 없도록 만들었고
간장치킨과 양념치킨은 소스가 필요하기 때문에 true를 반환하여 소스를 버무리도록 하였습니다.
public class Test {
public static void main(String[] args) {
System.out.println("=== 후라이드 치킨 레시피 ===");
Chicken basicFriedChicken = new FriedChicken();
basicFriedChicken.executeRecipe();
// 간장 치킨 레시피
System.out.println("\n=== 간장 치킨 레시피 ===");
Chicken soySauceChicken = new SoySauceChicken();
soySauceChicken.executeRecipe();
// 양념 치킨 레시피
System.out.println("\n=== 양념 치킨 레시피 ===");
Chicken seasonedChicken = new SeasonedChicken();
seasonedChicken.executeRecipe();
}
}
=== 후라이드 치킨 레시피 ===
재료를 준비합니다.
치킨을 튀깁니다.
치킨 나왔습니다.
=== 간장 치킨 레시피 ===
재료를 준비합니다.
치킨을 튀깁니다.
치킨을 양념에 버무립니다.
치킨 나왔습니다.
=== 양념 치킨 레시피 ===
재료를 준비합니다.
치킨을 튀깁니다.
치킨을 양념에 버무립니다.
치킨 나왔습니다.
디자인 원칙 - 할리우드 원칙
먼저 연락하지 마세요, 저희가 연락 드리겠습니다.
내가 언제 어떻게 해야 할 지를 알고, 스스로 제어 할 수 있는 일이면 하되, 그밖에 영역의 일은 정의해서 알려주면 행동하겠다는 것이다.
https://doublem.org/Hollywood-Principle/
예제에 적용된 할리우드 원칙
Chicken 추상 클래스는 구현체가 공통으로 가져야 하는 흐름을 정의하고,
구현체는 changeSauceRequired 메소드를 통해 필요에 따라 후크 메소드를 오버라이드하여 추가적인 동작을 수행합니다. 이것이 할리우드 원칙을 잘 지키고 있다고 말할 수 있습니다.
즉, mix 메소드는 후크 메소드로 changeSauceRequired 메소드의 반환값에 따라 버무릴지 말지를 정하는데
이렇게 되면 추상 클래스가 구체 클래스에 의존하지 않으면서 구체 클래스에서 원하는 방식으로 흐름을 제어할 수 있습니다.
'개발 도서' 카테고리의 다른 글
디자인 패턴 - 컴포지트 패턴 (1) | 2023.12.19 |
---|---|
디자인 패턴 - 반복자 패턴 (0) | 2023.12.19 |
디자인 패턴 - 어댑터 패턴과 퍼사드 패턴 (0) | 2023.12.12 |
디자인 패턴 - 커맨드 패턴 (0) | 2023.12.09 |
디자인 패턴 - 싱글톤 패턴 (0) | 2023.12.04 |