개발 etc

JAVA 자바 템플릿 콜백 패턴(Template Callback Pattern)

알통몬_ 2017. 3. 12. 20:56
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

템플릿 콜백 패턴은 스프링의 3대 프로그래밍 모델 중 하나인 

DI(의존성 주입)에서 사용하는 특별한 형태의 전략 패턴이에요.

전략 패턴과 모든 것이 동일하지만 

전략을 익명의 내부 클래스로 정의해서 사용한다는 특징이 있습니다.


바로 예제를 볼게요^^


예제1)

package templateCallbackPattern;


public interface Strategy {

public abstract void runStrategy();

}

예제2)

package templateCallbackPattern;


public class Soldier {

void runContext(Strategy strategy) {

System.out.println("전투 시작");

strategy.runStrategy();

System.out.println("전투 종료");

}

}

예제3)

package templateCallbackPattern;


public class Client {

public static void main(String[] args) {

Soldier rambo = new Soldier();


/*

 * Strategy strategy = new StrategyGun();

 * rambo.runContext(strategy);

 */


/*

 * Strategy strategy = new IStrategy() {

 

 * @Override public void doStrategy() {

 * System.out.println("총! 총초종총 총! 총!"); } };

 

 * rambo.runContext(strategy);

 */


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("도끼! 독독..도도독 독끼!");

}

});

}

}

그런데 예제에서 보면 많은 부분에서 중복된 코드가 보이죠?

리펙터링된 코드로 다시 보겠습니다.


예제4)

package templateCallbackPatternRefactoring;


public interface Strategy {

public abstract void runStrategy();

}

예제5)

package templateCallbackPatternRefactoring;


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);

}

};

}

}


예제6)

package templateCallbackPatternRefactoring;


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("도끼! 독독..도도독 독끼!");

}

}

인터페이스는 동일합니다.

전략을 생성하는 코드가 컨텍스트, 즉 군인 내부로 들어왔어요.

클라이언트 코드가 깔끔해졌죠? 중복되는 부분을 컨텍스트로 옮겼기 때문이에요.

스프링은 이런 형식으로 리팩터링된 템플릿 콜백 패턴을 DI에 적그 활용하고 있어요.

결론적으로 스프링을 이해하고 활용하기 위해서는 전략 패턴, 템플릿 콜백 패턴, 

리팩터링된 템플릿 콜백 패턴을 잘 알아둬야겠죠?

마지막으로 

템플릿 콜백 패턴은 -전략을 익명 냐부 클래스로 구현한 전략 패턴- 입니다.

반응형