안녕하세요. Limky 입니다.
이번 시간엔 Strategy 전략 패턴에 이어 탬플릿 콜백 패턴(Template Callback Pattern)을 알아보겠습니다. 탬플릿 콜백 패턴(Template Callback Pattern)은 전략 패턴의 변형으로 DI (Dependency injection) 의존성 주입에서 사용하는 특별한 전략 패턴입니다. 탬플릿 콜백 패턴은 전략 패턴에 익명 내부 클래스를 가미해서 사용하는 방법입니다.
전략 패턴을 혹시 모르시면 아래 글을 참고 하시면 됩니다.
2017/08/28 - [Design_Pattern] - [Design_Pattern] 전략 패턴(Strategy Pattern)
자 바로 예제를 보겠습니다.
원래 기존 전략패턴에서 필요했던 구체클래스들은 StrategyGrenade.java, StrategyGun.java 였지만, 앞서 말했듯 익명 내부 클래스를 사용하기 때문에 필요가 없습니다.
Strategy.java (전략 인터페이스 정의)
public interface Strategy {
void runStrategy();
}
Solider.java(전략을 사용할 컨텍스트)
public class Solider {
void runContext(Strategy strategy) {
System.out.println("배틀 그라운드 시작");
strategy.runStrategy();
System.out.println("배틀 종료");
}
}
ClientWithCallback.java(클라이언트에서 내부 익명 클래스를 통한 구체클래스 재정의)
public class ClinetWithCallback {
public static void main(String[] args) {
Solider rambo = new Solider();
rambo.runContext(new Strategy() {
@Override
public void runStrategy() {
System.out.println("템플릿 콜백버전: 탕! 타탕!! 탕탕탕!");
}
});
System.out.println("\n");
rambo.runContext(new Strategy() {
@Override
public void runStrategy() {
System.out.println("템플릿 콜백버전: 수류탄 투척~! 쾅!!!");
}
});
}
}
결과
배틀 그라운드 시작
템플릿 콜백버전: 탕! 타탕!! 탕탕탕!
배틀 종료
배틀 그라운드 시작
템플릿 콜백버전: 수류탄 투척~! 쾅!!!
배틀 종료
위 코드는 자세히 보면 ClientWithCallback.java에서 콜백을 통한 내부 익명 클래스 재정의를 하는 모습이 보입니다. 안드로이드개발을 많이 해보신 분들이라면 정말 익숙한 코드지요???
자 그건 그렇고, 하지만 중복되는 코드가 많이 보이기 때문에 Refactoring 해보겠습니다.
Strategy.java (전략 인터페이스 정의)
public interface Strategy {
void runStrategy();
}
SoliderWithRefactoring.java(전략을 사용할 컨텍스트 + 내부 익명 클래스 이관 당함)
package TemplateCallbackPattern;
public class SoliderWithRefactoring {
void runContext(String StrategySound) {
System.out.println("배틀 그라운드 시작");
execute(StrategySound).runStrategy();
System.out.println("배틀 종료");
}
private Strategy execute(final String StrategySound) {
return new Strategy() {
@Override
public void runStrategy() {
System.out.println(StrategySound);
}
};
}
}
Client.java(클라이언트 Solider안에 내부 익명 클래스를 이관했다. -> 코드가 깔끔해짐)
public class Client {
public static void main(String[] args) {
SoliderWithRefactoring rambo = new SoliderWithRefactoring();
rambo.runContext("탕! 탕탕탕!");
System.out.println("\n");
rambo.runContext("수류탄 투척~! 쾅!!!");
}
}
결과
배틀 그라운드 시작
템플릿 콜백버전: 탕! 타탕!! 탕탕탕!
배틀 종료
+
배틀 그라운드 시작
템플릿 콜백버전: 수류탄 투척~! 쾅!!!
배틀 종료
'프로그래밍 > Design_Pattern' 카테고리의 다른 글
[Design_Pattern] 전략 패턴(Strategy Pattern) (2) | 2017.08.28 |
---|---|
[Design_Pattern] 팩토리 메서드 패턴(Factory Method Pattern) (4) | 2017.08.28 |
[Design_Pattern] 템플릿 메서드 패턴(Template Method Pattern) (3) | 2017.08.27 |
[Design_Pattern] 데코레이터 패턴(Decorator Pattern) (1) | 2017.08.25 |
[Design_Pattern] 프록시 패턴(Proxy Pattern) (4) | 2017.08.25 |
댓글