견본/회신 패턴은 전략 패턴의 변형으로 스프링의 3대 프로그래밍 모델 중 하나인 DI ( 의존성 주입 )에서 사용하는 전략 패턴
전략을 익명 내부 클래스로 정의해서 사용한다는 특징을 가지고 있다
package DesignPattern.templateCallbackPattern;
public interface Strategy {
public abstract void runStrategy();
}
package DesignPattern.templateCallbackPattern;
public class Soldier {
void runContext(Strategy strategy) {
System.out.println("시작");
strategy.runStrategy();
System.out.println("종료");
}
}
package DesignPattern.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("GUN");
}
});
System.out.println();
rambo.runContext(new Strategy() {
@Override
public void runStrategy() {
System.out.println("SWORD");
}
});
System.out.println();
rambo.runContext(new Strategy() {
@Override
public void runStrategy() {
System.out.println("BOW");
}
});
}
}
내부 전략을 계속 수정하는 중복 과정을 거치는데 이를 템플릿 콜백 패턴으로 바꿔보자
package DesignPattern.templateCallbackPattern;
public interface Strategy {
public abstract void runStrategy();
}
package DesignPattern.templateCallbackPattern;
public class Soldier {
void runContext(Strategy strategy) {
System.out.println("시작");
strategy.runStrategy();
System.out.println("종료");
}
private Strategy executeWeapon(final String weaponName) {
return new Strategy() {
@Override
public void runStrategy() {
System.out.println(weaponName);
}
};
}
}
package DesignPattern.templateCallbackPattern;
public class Client {
public static void main(String[] args) {
Soldier rambo = new Soldier();
rambo.runContext("GUN");
System.out.println();
rambo.runContext("SWORD");
System.out.println();
rambo.runContext("BOW");
}
}
중복과정의 코드들이 훨씬 간편해진 것이 보이는가? 전략패턴과 구조자체는 동일하지만 중복과정을 줄이고자 전략 생성 코드를 컨텍스트안에 집어넣은 부분을 이해하는 것이 핵심이다
전략을 익명 내부 클래스로 구현한 전략 패턴
마찬가지로 전략 패턴과 똑같이 OCP 와 DIP 가 적용된 설계 패턴이다