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

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

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

 

안녕하세요.

지난 번 포스팅인 템플릿 메소드 패턴에 이어서 비슷한 결이지만 방식은 다른 템플릿 메소드 콜백 패턴을 알아보려고 합니다. 

 

템플릿 메소드 콜백 패턴은 템플릿 메소드 + 콜백이 합쳐진 것이라고 생각합니다.

템플릿 메소드 : 기본 골격이 있고, 그 곳에서 일부 단계(혹은 일부 다른 부분)를 구현할 수 있게 합니다.

콜백 : 이를 상속이 아닌 인터페이스를 통한 위임을 사용하고, 메서드의 매개변수에 이 인터페이스를 전달하여 특정 시점이나 상황에 호출되게 합니다.

도구를 쓰는 것도 어렵네요 ^_ㅠ

 

지난번 사용한 예제를 그대로 템플릿 메소드 콜백 패턴으로 변경해보겠습니다.

 

지난번과 같이 템플릿이 되어줄 클래스가 필요합니다.

public class RestaurantRobot {
    public final void hello(final NameGenerator nameGenerator) {
        step1();
        step2(nameGenerator.generate());
        step3();
    }

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

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

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

 

여기서 달라진 점은 hello()라는 메소드에 NameGenerator를 매개변수로 받고 있습니다.

NameGenerator는 콜백이 되어줄 인터페이스입니다.

public interface NameGenerator {

    String generate();
}

 

지난번 템플릿 메소드 패턴처럼 상속이 아니기 때문에 꼭 클래스를 만들 필요가 없습니다.

클래스를 만들어도 되고, 익명 내부 클래스를 사용할 수 있습니다. 

public class Client {

    public static void main(String[] args) {
        final RestaurantRobot chupinRestaurant = new RestaurantRobot();

        // 익명 내부 클래스
        chupinRestaurant.hello(new NameGenerator() {
            @Override
            public String generate() {
                return "chupin";
            }
        });

        // 위 익명 내부 클래스를 lambda로 표현
        chupinRestaurant.hello(() -> "chupin");

        // 구체 클래스를 만든 케이스
        final RestaurantRobot techRestaurant = new RestaurantRobot();
        techRestaurant.hello(new Tech());
    }
}

 

템플릿 메서드 콜백 패턴은 용어가 생소할 뿐 아마 많은 분들이 이미 개발하면서 사용하고 계실 것 같습니다.

 

저도 같은 책임을 가지고 동일한 역할을 수행하는 구체들을 묶어서 인터페이스로 추상화 한 후,

이를 사용하는 측에서 매개변수로 이 인터페이스를 받아서 행위를 위임한 적이 있습니다.

이게 템플릿 메서드 콜백 패턴이었군요! ㅎㅎ

 

728x90