템플릿 콜백 패턴 (Template Callback Pattern)
- 전략 패턴의 변형으로, 스프링 DI(의존성 주입)에서 사용하는 특별한 형태의 전략 패턴이다.
템플릿 콜백 패턴은 전략패턴과 동일하나, 전략을 익명 내부 클래스로 정의해서 사용한다.
참고 - 전략패턴 - https://old-developer.tistory.com/136
샘플예제
전략패턴을 템플릿 콜백 패턴으로 변경하기
1. 전략 인터페이스
// 전략 인터페이스
public interface Strategy {
public abstract void runStrategy();
}
2. 전략 사용 컨텍스트
// 전략을 사용하는 컨텍스트(군인)
public class Soldier {
void runContext(Strategy strategy) {
System.out.println("전투 시작");
strategy.runStrategy();
System.out.println("전투 종료");
}
}
3. 익명 내부 전략을 사용하는 클라이언트
// 익명 내부 전략을 사용하는 클라이언트
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("도끼!!! 도끼.....");
}
});
}
}
옵션 - 위 공통 부분 리팩터링
// 전략을 사용하는 컨텍스트(군인)
public class Soldier2 {
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);
}
};
}
}
public class Client2 {
public static void main(String[] args) {
Soldier2 rambo = new Soldier2();
// 람보 총을 사용
rambo.runContext("총 ! 총총총!!!");
System.out.println();
// 람보 칼을 사용
rambo.runContext("칼 ! 칼~~!!!");
System.out.println();
// 람보 도끼를 사용
rambo.runContext("도끼.. 도끼..!!!");
}
}
참고서적 : 스프링 입문을 위하 자바 객체지향의 원리와 이해
디자인 패턴이란..
개발을 진행할때 자주 나오는 어떤 패턴을 미리 예상하여 어떻게 구현할것인지를 그 틀(패턴)을 정의해 놓은 이론적인 개념이다.
'객체지향 (OOP) > 디자인 패턴' 카테고리의 다른 글
전략 패턴(strategy pattern) (0) | 2021.06.30 |
---|---|
팩토리 메서드 패턴(Factory method pattern) (0) | 2021.06.30 |
템플릿 메소드 패턴(template method pattern) (0) | 2021.06.29 |
싱글톤 패턴(Singleton Pattern) (0) | 2021.06.28 |
데코레이터 패턴 (Decorator Pattern) (0) | 2021.06.28 |