본문 바로가기
츄Log/기타 끄적

템플릿 메소드 패턴 (Template Method Pattern)

by 츄츄🦭 2023. 12. 14.
728x90

 

안녕하세요!

 

오늘은 템플릿 메소드 패턴을 한 번 만들어보려고 합니다.

템플릿 메소드 패턴은,

전체적인 구조(템플릿)를 상위클래스에서 정의하고 일부 영역을 변경할 수 있게끔 만들어서 중복을 줄이고 코드를 재사용할 수 있게 합니다. 

 

일종의 IoC인 템플릿 메소드 패턴은 많은 프레임워크, 라이브러리에서 사용하고 있습니다.

왜 일종의 IoC냐면, 

하위 클래스에서 구현한 추상메소드가 결국 상위 클래스의 흐름에 따라 호출되기 때문입니다.

즉 제어는 상위클래스에서 이루어지는 것입니다. 

 

UML Class Diagram에서 보이는 것처럼 템플릿 메소드 패턴은 상속을 통해 이루어집니다. 

출처 : https://en.wikipedia.org/wiki/Template_method_pattern

 

코드로 한 번 보겠습니다.

앞으로 나올 코드를 간단하게 설명하자면, 

레스토랑에서 손님이 들어왔을 때 인사하는 로봇의 인사(hello) 메소드를 구현할 예정입니다. 

1. 어서오세요.

2. OO 레스토랑입니다.

3. 만나서 반갑습니다. 

로봇은 여러 레스토랑에서 활용할 수 있기 때문에 레스토랑의 이름을 업체별로 만들어 주려고 합니다. 

 

먼저 템플릿인 추상클래스입니다. 

public abstract class RestaurantRobot {

    // 하위 클래스가 상위 클래스의 메소드를 오버라이딩 할 수 있고, 
    // 이는 리스코프 치환 원칙을 어길 여지가 있기 때문에 final 키워드를 붙여줬습니다.
    public final void hello() {
        step1();
        step2(getName());
        step3();
    }

    // 하위클래스에서 자기가 신경써야 할 것만 책임질 수 있게 getName()을 abstract method로 설계했습니다.
    protected abstract String getName();

    private void step1() {
        System.out.println("어서오세요.");
    }

    private void step2(final String name) {
        System.out.println(name + " 레스토랑입니다.");
    }

    private void step3() {
        System.out.println("만나서 반갑습니다.");
    }
}

 

그리고 이 추상 메소드를 구현한 ChpinRestaurant와 TechRestaurant 입니다.

public class ChupinRestaurantRobot extends RestaurantRobot {

    @Override
    protected String getName() {
        return "츄핀";
    }
}


public class TechRestaurantRobot extends RestaurantRobot {

    @Override
    protected String getName() {
        return "테크";
    }
}

 

이렇게 추상 메소드를 구현하면,

public class Client {

    public static void main(String[] args) {
        final RestaurantRobot chupinRes = new ChupinRestaurantRobot();
        final RestaurantRobot techRes = new TechRestaurantRobot();

        chupinRes.hello();
        techRes.hello();
    }
}

// 결과
어서오세요.
츄핀 레스토랑입니다.
만나서 반갑습니다.
어서오세요.
테크 레스토랑입니다.
만나서 반갑습니다.

 

이렇게 원하는 결과를 얻을 수 있습니다.

 

728x90