템플릿 콜백 패턴(Template Callback Pattern)
디자인 패턴템플릿 콜백 패턴은 전략 패턴의 변형이며 스프링 3대 프로그래밍 모델 중 하나인 DI (의존성 주입)에서 사용하는 특별한 형태의 전략 패턴이다. 템플릿 콜백 패턴은 전략 패턴과 모든 것이 동일하나 전략을 익명 내부 클래스로 정의해서 사용하는 것이 차이이다. 앞에서 봤던 내용을 템플릿 콜백 패턴으로 변경해보자.
package 전략패턴;
public class Client {
public static void main(String[] args) {
전략 strategy = null;
군인 rambo = new 군인();
strategy = new 총();
rambo.runContext(strategy);
strategy = new 칼();
rambo.runContext(strategy);
strategy = new 활();
rambo.runContext(strategy);
}
}
위의 코드는 기존의 코드이다. 익명 내부 클래스를 사용하여 변경해보자.
package 전략패턴;
public class Client {
public static void main(String[] args) {
군인 rambo = new 군인();
rambo.runContext(new 전략() {
@Override
public void runStrategy() {
System.out.println("총 : 빵야");
}
});
rambo.runContext(new 전략() {
@Override
public void runStrategy() {
System.out.println("칼 : 슈욱");
}
});
rambo.runContext(new 전략() {
@Override
public void runStrategy() {
System.out.println("활 : 슈슉");
}
});
}
}
위와 같이 익명 내부 클래스로 변경했다. 코드를 보자하니 중복되는 부분이 많다. 이를 리팩토링 해보자.
package 전략패턴;
public class 군인 {
void runContext(String weaponSound) {
System.out.println("전투 시작");
executeWeapon(weaponSound).runStrategy();
System.out.println("전투 종료");
}
private 전략 executeWeapon(final String weaponSound) {
return new 전략() {
@Override
public void runStrategy() {
System.out.println(weaponSound);
}
};
}
}
public class Client {
public static void main(String[] args) {
군인 rambo = new 군인();
rambo.runContext("총");
rambo.runContext("칼");
rambo.runContext("활");
}
}
아래와 같이 리팩토링이 가능하다. 리팩토링의 예제를 보면 볼수록 신기하고 즐겁다.
이렇게 리팩토링하여 보니, 전략이 군인의 내부로 들어왔다. 스프링은 이와 같은 형식으로 템플릿 콜백 패턴을 DI에 적극 활용하고 있다. 따라서 전략 패턴과 템플릿 콜백 패턴, 리팩터링된 템플릿 콜백 패턴은 꼭 기억해둘 필요성이 있다.
마지막 한마디로 정리해보자.
"전략을 익명 내부 클래스로 구현한 전략 패턴"
guy-who-writes-sourcecode.tistory.com/30
'디자인 패턴' 카테고리의 다른 글
전략 패턴(Strategy Pattern) (1) | 2020.12.07 |
---|---|
팩터리 메소드 패턴(Factory Method Pattern) (0) | 2020.12.07 |
템플릿 메소드 패턴 (Template Method Pattern) (0) | 2020.12.07 |
싱글톤 패턴 (Singleton Pattern) (1) | 2020.12.07 |
데코레이터 패턴(Decorator Pattern) (0) | 2020.12.03 |