템플릿 콜백 패턴은 변하지 않는 부분은 냅두고 변하는 부분은 커스터마이징하여 사용할 수 있게 해준다.
클라이언트는 템플릿 오브젝트의 메서드에 콜백을 구현해 제공한다.
템플릿은 메서드 수행중에 제공받은 콜백 메서드를 호출하고 그 반환값을 사용해 나머지 작업을 수행한다. 그림으로 보자면 이렇다.
햄버거를 만들자. 템플릿에는 빵이 있고
우리는 패티를 콜백으로 제공할 것이다.
public class Hamburger {
public void makeBurger(Patty patty){
System.out.println("참깨빵");
//콜백 메서드 호출
String pattyName = patty.getPattyName();
if(pattyName.equals("순쇠고기")){
pattyName += " 패티두장";
} else if(pattyName.equals("특별한 소스")){
pattyName += " 양상추";
}
System.out.println(pattyName);
System.out.println("참깨빵");
}
}
//함수형 인터페이스라는 것을 명시
@FunctionalInterface
public interface Patty {
String getPattyName();
}
public class Cook {
public void cookBurger(){
Hamburger hamburger = new Hamburger();
hamburger.makeBurger(new Patty() {
@Override
public String getPattyName() {
return "순쇠고기";
}
});
// 람다식을 이용해 ()-> "순쇠고기"; 이런식으로 더 간결하게 작성할 수 잇다.
}
}
public class test {
public static void main(String[] args) {
Cook cook = new Cook();
cook.cookBurger();
}
// 결과)
// 참깨빵
// 순쇠고기 패티두장
// 참깨빵
}
스프링의 JdbcTemplate 은 실제로 이 패턴을 응용해 설계됐다고 한다.
JdbcTemplate 은
Connection 과 같은 리소스들을 가져오고
쿼리를 실행하고(콜백)
다시 리소스들을 반환해 준다.