전략 패턴
전략 패턴은 실행 중에 바뀔 수 있는 알고리즘이나 행위를 인터페이스로 분리하고, 구체 전략 객체를 교체해 동작을 바꾸는 디자인 패턴입니다.
핵심 개념
- 변하는 행위를 Context에서 분리해 Strategy 인터페이스로 추상화합니다.
- Context는 구체 구현이 아니라 인터페이스에 의존합니다.
- 새로운 전략이 필요하면 기존 Context를 수정하지 않고 구현체를 추가합니다.
- 상속보다 조합을 활용해 행위를 유연하게 교체합니다.
구조
Client -> Context -> Strategy(interface)
├─ ConcreteStrategyA
├─ ConcreteStrategyB
└─ ConcreteStrategyC
Java 예시
interface MoveStrategy {
boolean isMovable(int input);
}
class EvenNumberMoveStrategy implements MoveStrategy {
@Override
public boolean isMovable(int input) {
return input % 2 == 0;
}
}
class Car {
private final MoveStrategy strategy;
private final int position;
Car(MoveStrategy strategy, int position) {
this.strategy = strategy;
this.position = position;
}
Car move(int input) {
if (strategy.isMovable(input)) {
return new Car(strategy, position + 1);
}
return this;
}
}
장점
- 조건문이 늘어나는 코드를 줄일 수 있습니다.
- 전략별 테스트가 쉬워집니다.
- 런타임에 행위를 교체할 수 있습니다.
- OCP를 지키기 쉽습니다.
주의사항
- 전략 객체가 너무 많아지면 구조가 복잡해질 수 있습니다.
- 단순한 조건 분기에는 오히려 과한 설계가 될 수 있습니다.
- Context와 Strategy의 책임 경계를 명확히 해야 합니다.
핵심 정리
전략 패턴은 변하는 행위를 객체로 분리해 조합으로 교체하는 패턴입니다.
조건문이 복잡해지거나 알고리즘 교체 가능성이 높은 경우에 유용합니다.