기존의 템플릿 메서드 패턴은
알고리즘의 골격을 정의하고 일부 단계만 하위 클래스로 연기
하는 것이다.
하지만 이것은 상속의 단점을 가지고 간다.
자식 클래스가 부모 클래스를 강하게 의존하고 있다던지 등.
전략 패턴 또한 이런 변하는 부분과 변하지 않는 부분에 대한 해결을 제시하는 패턴이다.
전략 패턴은 템플릿 메서드 패턴 처럼 부모가 문맥(Context)를 가지고 있는 게 아닌,
문맥 객체에 로직 객체를 줘서 위임하는 방식이다.
즉, 문맥에 고정된 것을 넣고 로직 객체의 로직을 실행시키도록 한다
이렇게 문맥 객체를 하나 따로 만들고,
인터페이스를 만들어서,
로직들은 그 인터페이스를 상속 받아서 구현한다.
@Slf4j
public class ContextV1 {
private Strategy strategy;
public ContextV1(Strategy strategy){
this.strategy = strategy;
}
public void execute(){
long startTime = System.currentTimeMillis();
// 비즈니스 로직
strategy.call();
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("resultTime={}", resultTime);
}
}
이렇게 문맥을 만들고
public interface Strategy {
void call();
}
전략 패턴 인터페이스를 만들고
@Slf4j
public class StrategyLogic1 implements Strategy{
@Override
public void call() {
log.info("비즈니스 로직1 실행");
}
}
이렇게 로직을 구현한다.
그러면,
public ContextV1(Strategy strategy){
this.strategy = strategy;
}
이렇게 로직을 받았다가
public void execute(){
long startTime = System.currentTimeMillis();
// 비즈니스 로직
strategy.call();
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("resultTime={}", resultTime);
}
문맥 부분에서 이렇게 로직을 호출한다.
@Test
void strategyV1(){
StrategyLogic1 strategyLogic1 = new StrategyLogic1();
ContextV1 context1 = new ContextV1(strategyLogic1);
context1.execute();
}
'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글
23. 전략 패턴 인자로 받기 (0) | 2024.01.17 |
---|---|
22. 전략 패턴 익명 및 람다 (0) | 2024.01.17 |
20. 템플릿 메서드 패턴 적용 (0) | 2024.01.15 |
19. 익명 클래스 (0) | 2024.01.15 |
18. 템플릿 메서드 패턴 예제 (0) | 2024.01.14 |