본문 바로가기
Design Pattern

[Design Pattern] 템플릿 콜백 패턴(Template Callback Pattern)

by jinjin98 2022. 10. 3.

전략 패턴에서 Context 는 변하지 않는 템플릿 역할을 합니다. 

그리고 변하는 부분은 파라미터로 넘어온 Strategy 의 코드를 실행해서 처리합니다.

이렇게 다른 코드의 파라미터로서 넘겨주는 실행 가능한 코드를 콜백(callback) 이라고 합니다.

이 콜백은 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있습니다.

callback 은 코드가 호출( call )은 되는데 코드를 넘겨준 곳의 뒤( back )에서 실행된다는 뜻입니다.

직접 Strategy 를 실행하는 것이 아니라,  Context.execute(..) 를 실행할 때 Strategy 를 넘겨주고,

Context 뒤에서 Strategy 가 실행됩니다

템플릿 콜백 패턴은 전략 패턴에서 템플릿과 콜백 부분이 강조된 패턴이라 할 수 있습니다.

스프링에서는 JdbcTemplate , RestTemplate , TransactionTemplate , RedisTemplate 처럼

다양한 템플릿 콜백 패턴이 사용됩니다.

스프링에서 이름에 XxxTemplate 이 있다면 템플릿 콜백 패턴으로 만들어져 있다고 생각햐면 됩니다.

 

public interface Strategy {
    public abstract void runStrategy();
}

 

콜백 로직을 전달할 인터페이스입니다.

 

public class Soldier {
    void runContext(Strategy strategy) {
        System.out.println("전투 시작");
        strategy.runStrategy();
        System.out.println("전투 종료");
    }
}

 

public class TemplateCallbackMethodTest {
    public static void main(String[] args) {
        Soldier rambo = new Soldier();

        rambo.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("총");
            }
        });

        System.out.println();

        rambo.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("칼");
            }
        });

        System.out.println();

        rambo.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("활");
            }
        });

        System.out.println();
    }
}

 

사실 이전에 포스팅한 전략 패턴의 코드와 크게 다르지 않습니다.

콜백을 사용할 경우에는 익명 내부 클래스나 람다를 사용하는 것이 편리해 이렇게 작성해보았습니다.

만약 여러 곳에서 함꼐 사용하는 경우에는 재사용을 위해 별도의 클래스로 만들어도 무방합니다.

 

이 포스팅은 자바 객체 지향의 원리와 이해의 내용을 참고하여 작성했습니다.

댓글