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
'츄Log > 기타 끄적' 카테고리의 다른 글
MySQL 트랜잭션 격리 수준 (isolation level) (1) | 2023.12.21 |
---|---|
MVCC (Multi Version Concurrency Control) (0) | 2023.12.21 |
템플릿 메소드 패턴 (Template Method Pattern) (0) | 2023.12.14 |
헷갈리는 compare/compareTo 이해하기 (0) | 2023.12.09 |
Java 스트림 (Stream)의 특징 (1) | 2023.12.08 |