전략패턴은 상속 (extends) 보다 구성(class fleid)에 의존한다.
상속은 단일 클래스만 확장할 수 있고, 컴파일 타임에 타입이 지정되므로 정적이다.
이와 반대로 구성은 관계로 이루어져 있고 런타임에 동작을 변경할 수 있어 유연하다는 장점을 가지고 있다.
전략패턴을 이용한 간단한 계산 어플리케이션
public interface Strategy {
int execute(int num1, int num2);
}
public class Subtraction implements Strategy {
@Override
public int execute(int num1, int num2) {
return num1- num2;
}
}
public class Addition implements Strategy {
@Override
public int execute(int num1, int num2) {
return num1 + num2;
}
}
전략 인터페이스 구현체론 덧셈, 뺄셈 클래스가 있다.
public class OperationManager {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int execute(int num1,int num2) {
return this.strategy.execute(num1, num2);
}
}
OperationManager
는 strategy를 필드를 가지고 있는 구성 관계로 구현했다.
public static void main(String[] args) {
OperationManager manager = new OperationManager();
manager.setStrategy(new Addition());
int result = manager.execute(1, 2);
System.out.println("result = " + result);
}
클라이언트 코드에서 클라이언트가 전략(사용한 구현체)을 정하는 것을 볼 수 있는데 이는 클라이언트에게 분기를 위임한 것이다. (if문을 밖으로 밀어냄)
OperationManger
부분에 if문이나 instanceOf 가 등장하면 전략패턴을 사용하지 않은 것이다.
전략패턴은 구성을 이용해 런타임 시에 원하는 전략을 골라 사용할 수 있다는 장점이 있다.