전략 패턴(Strategy Pattern)
전략 패턴은 디자인 패턴의 꽃이라 할 수 있다. 따라서 스프링을 공부하고자 하는 사람은 꼭 이해하고 넘어가야 할 부분이다. 주의깊게 보도록 해보자.
전략 패턴을 구성하는 요소는 세 가지다.
- 전략 메소드를 가진 전략 객체
- 전략 객체를 사용하는 컨텍스트 (전략 객체의 사용자/소비자)
- 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트
전략 패턴의 맹점은 다음과 같다.
"전략 패턴에서 클라이언트는 다양한 전략 중 하나를 선택해 생성한 후 컨텍스트에 주입한다."
예를 들어 군인이 있다고 가정해보자. 군인은 다양한 무기중 주어진 환경에 적합한 무기를 사용할 것이다. 또한 이를 보급해주는 보급 장교가 있다고 해보자. 그럼 여기서 무기는 전략이 되고, 군인은 컨텍스트, 보급 장교는 제 3자인 클라이언트가 된다.
다음은 코드를 볼 예정인데, 다양한 전략, 무기를 공통된 방법으로 사용하기 위해서 인터페이스를 정의할 것이다.
package 전략패턴;
public interface 전략 {
public abstract void runStrategy();
}
public class 총 implements 전략{
@Override
public void runStrategy() {
System.out.println("총 : 탕탕탕");
}
}
public class 칼 implements 전략{
@Override
public void runStrategy() {
System.out.println("칼 : 슝슝");
}
}
public class 활 implements 전략{
@Override
public void runStrategy() {
System.out.println("활 : 슉 슉 슈슝");
}
}
public class 군인 {
void runContext(전략 strategy) {
System.out.println("전투 시작");
strategy.runStrategy();
System.out.println("전투 종료");
}
}
public class Client {
public static void main(String[] args) {
전략 strategy = null;
군인 rambo = new 군인();
strategy = new 총();
rambo.runContext(strategy);
strategy = new 칼();
rambo.runContext(strategy);
strategy = new 활();
rambo.runContext(strategy);
}
}
위의 코드의 흐름은 클라이언트(=보급장교)가 군인인 람보에게 총, 칼, 활을 주고 전투가 시작되고 전투가 끝나는 흐름이 된다. 위에 보면 전략인 무기가 다양하게 변경되면서 컨텍스트를 실행할 수 있게 된 것이다. 전략 패턴은 디자인 패턴의 꽃이라 했던 것처럼, 다양한 문제 상황의 해결책으로 사용된다.
혹여라도 SOLID에 대한 부분이나 이전에 디자인 패턴이 공부한 기억이 있다면, 템플릿 메소드 패턴과 유사하다는 생각이 들 수도 있다. 같은 문제에 해결책으로 템플릿 메소드 패턴과 전략 패턴을 선택하여 사용할 수 있는데 상속이라는 제한이 있는 템플릿 메소드 패턴보다는 전략 패턴을 Java 진형에서 더 많이 사용한다고 한다.
마지막 한마디로 정리하자.
"클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴"
guy-who-writes-sourcecode.tistory.com/