클라이언트가 execute(callback)를 실행하면 execute()에서 call()을 호출하여 사용한다.
@Slf4j
public class TimeLogTemplate {
public void execute(Callback callback){
long startTime = System.currentTimeMillis();
//비즈니스 로직 실행
callback.call(); //위임
//비즈니스 로직 종료
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("resultTime={}", resultTime);
}
}
//함수형 인터페이스
public interface Callback {
void call();
}
@Slf4j
public class TemplateCallbackTest {
/**
* 템플릿 콜백 패턴 - 익명 내부 클래스
*/
@Test
void callbackV1(){
TimeLogTemplate template = new TimeLogTemplate();
//전략 1
template.execute(() -> log.info("비즈니스 로직1 실행"));
//전략 2
template.execute(() -> log.info("비즈니스 로직2 실행"));
}
}
별도의 클래스를 만들어서 전달해도 되지만, 콜백을 사용할 경우 익명 내부 클래스나 람다를 사용하는 것이 편리하다.
여러 곳에서 함께 사용되는 경우 재사용을 위해 콜백을 별도의 클래스로 만들어도 된다.