카테고리 없음
템플릿 콜백 패턴(Template Callback Pattern - 견본/회신 패턴)
kyeongjun-dev
2020. 8. 5. 16:50
템플릿 콜백 패턴
스프링의 3대 프로그래밍 모델 중 하나인 DI(의존성 주입)에서 사용하는 특별한 형태의 전략 패턴이다.
전략 패턴과 모든 것이 동일한데 전략을 익명 내부 클래스로 정의해서 사용한다는 특징이 있다.
앞의 게시물인 '전략 패턴'게시물에서 StrategyGun.java StrategySword.java StrategyBow.java'는 필요 없다.
예시 코드
- Strategy.java
package templateCallbackPattern;
public interface Strategy {
public abstract void runStrategy();
}
- Soldier.java
package templateCallbackPattern;
public class Soldier {
void runContext(Strategy strategy) {
System.out.println("전투 시작");
strategy.runStrategy();
System.out.println("전투 종료");
}
}
- Client.java
package templateCallbackPattern;
public class Client {
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("활 활 활");
}
});
}
}
- 결과
전투 시작
총 총 총
전투 종료
전투 시작
칼 칼 칼
전투 종료
전투 시작
활 활 활
전투 종료
중복된 부분이 많으므로 리팩토링
리팩토링 후 코드(인터페이스 코드는 동일)
- Strategy.java
package teplatecallbackPatternRefactoring;
public interface Strategy {
public abstract void runStrategy();
}
- Soldier.java
package teplatecallbackPatternRefactoring;
public class Soldier {
void runContext(String weaponSound) {
System.out.println("전투 시작");
executeWeapon(weaponSound).runStrategy();
System.out.println("전투 종료");
}
private Strategy executeWeapon(final String weaponSound) {
return new Strategy() {
@Override
public void runStrategy() {
System.out.println(weaponSound);
}
};
}
}
전략을 생성하는 코드가 군인 즉, 컨텍스트 안으로 들어갔다.
- Client.java
package teplatecallbackPatternRefactoring;
public class Client {
public static void main(String[] args) {
Soldier rambo = new Soldier();
rambo.runContext("총 총 총");
System.out.println();
rambo.runContext("칼 칼 칼");
System.out.println();
rambo.runContext("활 활 활");
System.out.println();
}
}
- 결과
전투 시작
총 총 총
전투 종료
전투 시작
칼 칼 칼
전투 종료
전투 시작
활 활 활
전투 종료
정리
- 템플릿 콜백 패턴이란 "전략을 익명 내부 클래스로 구현한 전략 패턴"
- 개방 폐쇄 원칙(OCP), 의존 역전 법칙(DIP)이 적용된 설계 패턴
스프링은 이런 형식으로 리팩터링된 템플릿 콜백 패턴을 DI에 적극 활용한다. 따라서 스프링을 이해하고 활용하기 위해서는 전략 패턴과 템프릿 콜백 패턴, 리팩터링된 템플릿 콜백 패턴을 잘 기억해두자.