전략 패턴에 대해서 설명해주세요
전략 패턴은 객체의 행위를 직접 수정하지 않고, 추상화된 전략의 구현체를 교체해 동작을 바꾸는 디자인 패턴입니다.
핵심 아이디어
객체의 행위를 인터페이스로 정의하고, 이 인터페이스를 구현하는 여러 전략을 외부에서 주입합니다. Context는 구체 전략이 아니라 인터페이스에 의존하므로 전략을 쉽게 교체할 수 있습니다.
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;
}
}
언제 유용한가
- 조건문으로 여러 알고리즘을 선택하는 코드가 늘어날 때
- 실행 시점에 행위를 교체해야 할 때
- 알고리즘별 테스트를 독립적으로 작성하고 싶을 때
- 상속보다 조합으로 유연하게 확장하고 싶을 때
정리
전략 패턴은 변하는 행위를 전략 객체로 분리하고, Context는 전략 인터페이스에 의존하게 만드는 패턴입니다. 새로운 행위가 필요하면 기존 코드를 크게 수정하지 않고 전략 구현체를 추가하면 됩니다.