개발놀이터

전략 패턴 본문

리팩토링/GOF 디자인패턴

전략 패턴

마늘냄새폴폴 2022. 7. 6. 04:13

전략패턴이란 무엇인가?

전략패턴이란 객체가 할 수 있는 각각의 행위에 대해 전략클래스를 생성하고 유사한 행위들을 캡슐화하는 인터페이스를 정의하여 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 변경하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장시킬 수 있는 패턴을 말한다.

 

전략패턴은 변하지 않는 부분은 Context라는 곳에 두고, 변하는 부분은 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결한다. 상속이 아니라 위임으로 문제를 해결하는 것이다.

 

전략패턴을 사용하면 전략을 추가하더라도 기존 코드를 변경하지 않아도 되고 상속대신 위임을 사용하게 된다. 위임을 사용한다는 것은 상속을 강요하지않는다는 것이고 이는 상속이 정말 필요한 곳에 사용할 수 있다는 의미이다.

 

전략 패턴은 런타임에 전략을 바꾸고 싶을 때 사용한다. 

 

전략패턴의 구조

 

 

전략패턴 예제

 

1. Strategy라는 인터페이스를 만든다. 

public interface Strategy {
	
    void call();
}

 

2. Strategy를 구현하는 구현체 StrategyLogic1, StrategyLogic2를 만든다. 

@Slf4j
public class StrategyLogic1 implements Strategy {
	
    @Override
    ipublic void call() {
    	log.info("비즈니스 로직1 실행");
    }
}
@Slf4j
public class StrategyLogic2 implements Strategy {
	
    @Override
    ipublic void call() {
    	log.info("비즈니스 로직2 실행");
    }
}

 

3. 변하지 않는 부분인 Context를 만든다. 

@Slf4j
public class Context {
	
    private Strategy strategy;
    
    ipublic Context(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);
    }
}

 

4. Strategy를 스프링 빈으로 등록하거나 사용할 때 구현체를 적절히 바꿔주면서 사용하면 된다.

@Test
void strategy() {
	
    Strategy strategyLogic1 = new StrategyLogic1();
    Context context1 = new Context(strategyLogic1);
    context.execute();
    
    Strategy strategyLogic2 = new StrategyLogic2(0;
    Context context2 = new Context(strategyLogic2);
    context2.execute();
}

 

이렇게 전략 패턴을 알아보았다. 하지만 전략 패턴과 상당히 비슷한 부분이 있는 패턴이 있다. 바로 템플릿  메서드 패턴이다. 

https://coding-review.tistory.com/116?category=1053742 

 

템플릿 메서드 패턴

템플릿 메서드 패턴은 무엇인가? 템플릿 메서드 패턴은 특정 작업을 처리하는 일부분을 서브클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패

coding-review.tistory.com

 

전략패턴과 템플릿 메서드 패턴의 차이점이 뭘까? 

 

구조적으로 본다면 템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿을 두고, 변하는 부분을 자식 클래스에 두어서 상속을 통해서 문제를 해결한다면 전략 패턴은 변하지 않는 부분을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결했다. 템플릿 메서드 패턴은 상속으로, 전략 패턴은 위임으로 문제를 해결한다고 정리할 수 있겠다. 

'리팩토링 > GOF 디자인패턴' 카테고리의 다른 글

프록시 패턴  (0) 2022.07.08
데코레이터 패턴  (0) 2022.07.07
템플릿 메서드 패턴  (0) 2022.07.05