Template Callback?
템플릿 콜백 패턴의 경우 전략패턴의 변형적인 패턴입니다
Strategy(전략) 패턴의 설명은 제 게시글에 나와 있으니 참고해주세요 ^-^
그림으로 보는게 참 어렵죠?
단순히 설명하자면,
템플릿 콜백 패턴은 전략 패턴에 익명 클래스(또는 함수)를 더해서 사용하는 방식입니다
Java8에 나온 익명함수(lamba)를 사용해서 Interface만 구현한 채, 실제 로직을 구현하는 방식이죠!
그렇기 때문에, 이 패턴은 Spring에서 DI(Dependency Injection) 의존성 주입과 매우 유사합니다.
Spring을 개발하시다 보면 이러한 의존성 주입이 매우매우 자주 일어나는 것을 확인할 수 있는데,
그래서 Spring 개발할 때 많이 쓰이는 패턴중에 하나입니다!
전략 패턴을 why? How? What? 에 대해서는 역시나 여기 링크를 참고해주세요~!
예시
똑같은 예제를 사용해볼께요
우리는 가위바위보 게임을 하고 싶습니다.
사용자는 가위 혹은 바위 혹은 보 를 제출해야 되는데, 이것은 컴파일 타임이 아니라 런타임에 결정되겠죠?
그래서 인터페이스(interface)로 추출해보겠습니다
package designpattern.templatecallback;
interface RockScissorPaper {
String submit();
}
이 인터페이스는 가위바위보 중에서 무엇을 제출할 것인지에 대한 정책을 나타내고 있습니다
그러면 게임을 진행하는 player를 만들어볼까요?
package designpattern.templatecallback;
class Player {
String play(final RockScissorPaper strategy) {
return strategy.submit();
}
}
모든 객체가 완성됬으니 테스트하러 가볼게요~!
package designpattern.templatecallback;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class PlayerTest {
private Player player;
@BeforeEach
void setUp() {
this.player = new Player();
}
@Test
@DisplayName("플레이어가 가위를 제대로 내는지 테스트")
void scissor_test() {
/* Given */
RockScissorPaper strategy = () -> "Scissor";
/* Then */
assertThat(player.play(strategy)).isEqualTo("Scissor");
}
@Test
@DisplayName("플레이어가 가위를 제대로 내는지 테스트")
void rock_test() {
/* Given */
RockScissorPaper strategy = () -> "Rock";
/* Then */
assertThat(player.play(strategy)).isEqualTo("Rock");
}
@Test
@DisplayName("플레이어가 가위를 제대로 내는지 테스트")
void paper_test() {
/* Given */
RockScissorPaper strategy = () -> "Paper";
/* Then */
assertThat(player.play(strategy)).isEqualTo("Paper");
}
}
테스트 코드에서도 알 수 있듯이
객체생성을 간략해게 Lambda 표현식으로 나타낸 것을 볼 수 있습니다~!
() -> "Paper"
마지막으로 Class Diagram을 보면서 정리해볼까 합니다!
'Developer > Design Pattern' 카테고리의 다른 글
Decorator Pattern - 데코레이터 패턴 (2) | 2020.01.26 |
---|---|
Proxy Pattern - 프록시 패턴 (0) | 2020.01.25 |
Bridge Pattern - 브릿지 패턴 (0) | 2020.01.05 |
Composite Pattern - 컴포지트 패턴 (0) | 2019.11.06 |
Command Pattern - 커맨드 패턴 (2) | 2019.10.19 |